Model
Mỗi bảng cơ sở dữ liệu có một “Model” tương ứng dùng để tương tác với bảng đó. Ngoài việc truy xuất các bản ghi từ bảng cơ sở dữ liệu, các mô hình Model còn cho phép bạn chèn, cập nhật và xóa các bản ghi khỏi bảng.
Model
Để thao tác với một bảng trong cơ sở dữ liệu bạn có thể tạo một model bằng cách kế thừa lại class model
use Skilldo\Model\Model;
class ExModel extends Model
{
// ...
}
Table Name
Khai báo tên table trong database mà model sẽ theo tác
use Skilldo\Model\Model;
class ExModel extends Model
{
protected string $table = 'ex_modal_table';
// ...
}
Primary Keys
Model cũng sẽ giả định rằng table cơ sở dữ liệu tương ứng của mỗi model có một cột khóa chính có tên id
.
Nếu cần, bạn có thể chỉ định $primaryKey trên model của mình để chỉ định một column khác làm khóa chính của model:
use Skilldo\Model\Model;
class ExModel extends Model
{
protected string $table = 'ex_modal_table';
protected string $primaryKey = 'ex_modal_id';
// ...
}
Columns
Chứa danh sách column của table
use Skilldo\Model\Model;
class ExModel extends Model
{
protected string $table = 'ex_modal_table';
protected string $primaryKey = 'ex_modal_id';
protected array $columns = [
'title' => ['string'],
'slug' => ['string'],
'content' => ['wysiwyg'],
'excerpt' => ['wysiwyg'],
'seo_title' => ['string'],
'seo_description' => ['string'],
'seo_keywords' => ['string'],
'status' => ['int', 0],
'image' => ['image'],
'post_type' => ['string', 'post'],
'public' => ['int', 1],
];
}
Các column thông thường được model tự động tạo từ database, đối với các column có kiểu xử lý dữ liệu đặc biệt bạn sẻ trỏ đến một mãng chứa 2 giá trị, giá trị đầu là loại dữ liệu, giá trị thứ 2 là giá trị mặc định Các loại dữ liệu được hỗ trợ
Loại dữ liệu | Mô tả | Hành động |
---|---|---|
int | Số nguyên | Dữ liệu sẽ được đưa về số nguyên |
float | Số thập phân | Dữ liệu sẽ được đưa về số thập phân |
string | Chuổi | Dữ liệu sẽ được lọc các thành phần code như html sẽ bị xóa bỏ |
slug | Chuổi slug | Dữ liệu sẽ được lọc các thành phần code như html sẽ bị xóa bỏ và đưa về dạng slug |
wysiwyg | Chuổi | Dữ liệu sẽ giữ lại code như html |
price | Giá | Dữ liệu sẽ lọc chỉ giữ lại dấu , hay . |
image | Hình ảnh | Dữ liệu sẽ lọc về dạng link hình ảnh của cms |
file | file | Dữ liệu sẽ lọc về dạng link file của cms |
array | array | Dữ liệu nhận vào nếu là array sẽ mã hóa serialize về dạng chuổi |
Truy Xuất Dữ Liệu
Một hàng/cột từ một bảng
Nếu bạn chỉ cần truy xuất một hàng từ bảng cơ sở dữ liệu, bạn có thể sử dụng phương thức get
hoặc first
của model.
Phương thức này sẽ trả về một đối tượng Model
duy nhất:
Phương thức get nhận vào một
Query Builder
để tạo câu lệnh query
$ex = ExModel::get(Qr::set('id', 10));
// Find a ExModel by ID
$ex = ExModel::whereKey(10)->first();
// Find a ExModel by ID
$ex = ExModel::find(10);
Danh sách dữ liệu
Nếu bạn cần lấy danh sách dữ liệu từ bảng cơ sở dữ liệu, bạn có thể sử dụng phương thức gets
hoặc fetch
của model.
Phương thức này sẽ trả về một đối tượng Illuminate\Support\Collection
chứa các Model
:
Phương thức nhận vào một
Query Builder
để tạo câu lệnh query
$ex = ExModel::get(Qr::set()->where('id', '<=', 20));
$ex = ExModel::where('id', '<=', 20)->fetch();
$ex = ExModel::whereKey([1,2,3,4,5])->fetch();
Đếm số lượng data
Nếu bạn cần đếm danh sách dữ liệu từ bảng cơ sở dữ liệu, bạn có thể sử dụng phương thức count
hoặc amount
của model.
Phương thức này sẽ trả về số int
:
Phương thức nhận vào một
Query Builder
để tạo câu lệnh query
$count = ExModel::count(Qr::set('id','<=', 20));
$count = ExModel::where('id', '<=', 20)->amount();
$max = ExModel::where('active', 1)->max('price');
$sum = ExModel::where('active', 1)->sum('price');
Thêm mới và cập nhật Model
Thêm mới
model cũng cung cấp phương thức create
có thể được sử dụng để chèn các bản ghi vào bảng cơ sở dữ liệu.
Phương thức create
chấp nhận một mảng tên và giá trị cột, sau khi add thành công phương thức add sẽ trả về id
của trường vừa add vào:
ExModel::create([
'username' => 'exampleUsername',
'password' => '123',
'email' => 'example@example.com'
]);
Cập nhật
model cũng cung cấp phương thức update
có thể được sử dụng để cập nhật các bản ghi trong bảng cơ sở dữ liệu.
Cập nhật bằng đối tượng Model
$user = User::find(1);
$user->firstname = 'Updated Fist Name';
$user->save();
cập nhật nhiều bản ghi cùng một lúc dựa trên các điều kiện
ExModel::whereKey(20)->update(['email' => 'exampleUp@example.com']);
Insert
Phương thức insert
sẽ tiến hành thêm mới hoặc cập nhật dữ liệu theo các điều kiện mà cms đưa ra, method insert
xác định hành động thêm mới hay cập nhật bằng trường id
//Thêm mới
ExModel::insert([
'title' => 'đây là tiêu đề',
'excerpt' => 'đây là mô tả',
]);
//cập nhật
ExModel::insert([
'id' => 10,
'title' => 'đây là tiêu đề',
'excerpt' => 'đây là mô tả',
]);
Để thiết lập các quy định khi insert data bạn sử dụng thuộc tính rules
use Skilldo\Model\Model;
class ExModel extends Model
{
protected string $table = 'ex_modal_table';
protected string $primaryKey = 'ex_modal_id';
protected array $rules = [
//..
];
}
slug
: bạn sẽ khai báo khi model của bạn chứa đối tượng có thể tạo ra đường dẫn mà người dùng có thể truy cập được
Loại dữ liệu | Kiểu | Mô tả |
---|---|---|
type | string | Module dữ liệu |
callback | string | Tên callback sẽ hiển thị giao diện khi người dùng truy cập đường dẫn domain/slug |
dependent | string | Nếu data dùng để thêm mới không chứa column slug thì model sẽ dùng column này để tạo slug |
namespace SkillDo\Model;
class ExModel extends Model
{
protected string $table = 'ex_modal_table';
protected string $primaryKey = 'ex_modal_id';
protected array $rules = [
'slug' => [
'type' => 'post',
'callback' => 'ThisIsMethodView',
'dependent' => 'title'
],
];
}
function ThisIsMethodView(SkillDo\Http\Request $request, $id) {
$object = ExModel::find($id);
Cms::setData('object', $object);
$template = Theme::template();
$template->setLayout('layout-file-name');
$template->setView('view-file-name');
}
Timestamps
: Theo mặc định, Model sử dụng các cộtcreated
vàupdated
trong bảng cơ sở dữ liệu tương ứng với Model của bạn. Model sẽ tự động lưu thời gian vào các cột này khi model tạo hoặc cập nhật dữ liệu. Nếu bạn không muốn các cột này được Model quản lý tự động, bạn nên đặt created, updated trong rules có giá trịfalse
:
Loại dữ liệu | Mô tả |
---|---|
created | nếu true khi thêm dữ liệu sẽ tự động thêm thời gian vào column created |
updated | nếu true khi cập nhật dữ liệu sẽ tự động thêm thời gian vào column updated |
Nếu bạn cần thay đổi tên của các cột được sử dụng để lưu trữ timestamps, bạn có thể sử dụng các hằng số CREATED_AT
và UPDATE_AT
trên Model của mình:
<?php
namespace SkillDo\Model;
class ExModel extends Model
{
protected string $table = 'ex_modal_table';
protected string $primaryKey = 'ex_modal_id';
const CREATED_AT = 'creation_date';
const UPDATED_AT = 'updated_date';
protected array $rules = [
'created' => true,
'updated' => true,
];
}
useraction
: Theo mặc định, Model sử dụng các cộtuser_created
vàuser_updated
trong bảng cơ sở dữ liệu tương ứng với Model của bạn. Model sẽ tự động lưu id user đang login vào các cột này khi model tạo hoặc cập nhật dữ liệu. Nếu bạn không muốn các cột này được Model quản lý tự động, bạn nên đặt user_created, user_updated trong rules có giá trịfalse
:
Loại dữ liệu | Mô tả |
---|---|
user_created | nếu true khi cập nhật dữ liệu sẽ tự động thêm id user hiện đang thao tác vào column user_created |
user_updated | nếu true khi cập nhật dữ liệu sẽ tự động thêm id user hiện đang thao tác vào column user_updated |
Nếu bạn cần thay đổi tên của các cột được sử dụng để lưu trữ useraction
, bạn có thể sử dụng các hằng số USER_CREATED_AT
và USER_UPDATED_AT
trên Model của mình:
<?php
namespace SkillDo\Model;
class ExModel extends Model
{
protected string $table = 'ex_modal_table';
protected string $primaryKey = 'ex_modal_id';
const USER_CREATED_AT = 'user_add_id';
const USER_CREATED_AT = 'user_up_id';
protected array $rules = [
'user_created' => true,
'user_updated' => true,
];
}
language
: Nếu Model của bạn có hỗ trợ đâ ngôn ngữ thì bạn đặt gia trị cholanguage
là tên module của bạn. Mặc định cms chỉ hỗ trợ đa ngôn ngữ các column có tên làtitle
,name
,excerpt
,content
<?php
namespace SkillDo\Model;
class ExModel extends Model
{
protected string $table = 'ex_modal_table';
protected string $primaryKey = 'ex_modal_id';
protected array $rules = [
'language' => 'ExModel',
];
}
//Thêm mới
ExModel::insert([
'title' => 'đây là tiêu đề',
'excerpt' => 'đây là mô tả',
'language' => [
'en' => [
'title' => 'this is title',
'excerpt' => 'this is description',
]
]
]);
-
hooks
dùng để thay đổi các hook mặc định của method insertLoại dữ liệu Kiểu Mô tả columns string Tên hook dùng để cập nhật các trường columns data string Tên hook dùng để cập nhật các dữ liệu trước khi add hoặc update vào database
<?php
namespace SkillDo\Model;
class ExModel extends Model
{
protected string $table = 'ex_modal_table';
protected string $primaryKey = 'ex_modal_id';
protected array $rules = [
'hooks' => [
'columns' => 'columns_db_ex_modal_table',
'data' => 'pre_insert_ex_modal_table_data',
]
];
}
add
Để thêm một số quy định cho lúc thêm mới dữ liệu
Loại dữ liệu | Mô tả |
---|---|
takeIt | Danh sách các trường nếu bỏ trống sẽ tự động lấy dư liệu của trường khác thay thế |
require | Danh sách các trường bắt buộc phải có giá trị |
<?php
namespace SkillDo\Model;
class ExModel extends Model
{
protected string $table = 'ex_modal_table';
protected string $primaryKey = 'ex_modal_id';
protected array $rules = [
'add' => [
'takeIt' => [
'seo_title' => 'title',
'seo_description' => 'excerpt',
],
'require' => [
'title' => 'Tiêu đề trang không được để trống'
]
]
];
}
Lúc thêm dữ liệu nếu column seo_title
không có giá trị sẽ tự động lấy giá trị từ trường title
Lúc thêm dữ liệu nếu column seo_description
không có giá trị sẽ tự động lấy giá trị từ trường excerpt