Nhảy tới nội dung
Phiên bản: 7.3.3

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ệuMô tảHành động
intSố nguyênDữ liệu sẽ được đưa về số nguyên
floatSố thập phânDữ liệu sẽ được đưa về số thập phân
stringChuổiDữ liệu sẽ được lọc các thành phần code như html sẽ bị xóa bỏ
slugChuổi slugDữ 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
wysiwygChuổiDữ liệu sẽ giữ lại code như html
priceGiáDữ liệu sẽ lọc chỉ giữ lại dấu , hay .
imageHình ảnhDữ liệu sẽ lọc về dạng link hình ảnh của cms
filefileDữ liệu sẽ lọc về dạng link file của cms
arrayarrayDữ 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ả',
]);

Quy tắc

Để thiết lập các quy định khi add, update, insert data bạn sử dụng thuộc tính rules hoặc các trait

Các ràng buộc

Các ràng buộc sẽ được quy định trong property rules

use Skilldo\Model\Model;

class ExModel extends Model
{
protected string $table = 'ex_modal_table';

protected string $primaryKey = 'ex_modal_id';

protected array $rules = [
//..
];
}

  • Ràng buộc Timestamps : Theo mặc định, Model sử dụng các cột createdupdated 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ệuMô tả
creatednếu true khi thêm dữ liệu sẽ tự động thêm thời gian vào column created
updatednế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_ATUPDATE_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ột user_createduser_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ệuMô tả
user_creatednế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_updatednế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_ATUSER_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,
];
}
  • hooks dùng để thay đổi các hook mặc định của method insert

    Loại dữ liệuKiểuMô tả
    columnsstringTên hook dùng để cập nhật các trường columns
    datastringTê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ệuMô tả
takeItDanh 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ế
requireDanh 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

Liên kết route 7.3.0

Để tạo liên kết với bảng route giúp đối tượng có thể được truy cập từ giao diện người dùng bạn sử dụng trait ModelRoute

namespace SkillDo\Model;

use SkillDo\Traits\ModelRoute;

class ExModel extends Model
{
use ModelRoute;
}

Để thiết lập liên kết bạn cần khai báo thông tin liên kết vào property route sau khi thêm ModelRoute, property route là một array với các key

KeyKiểuMô tả
typestringModule dữ liệu
callbackstringTên callback sẽ hiển thị giao diện khi người dùng truy cập đường dẫn domain/slug
dependentstringNế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
controllerstringđường dẫn tới controller (nếu không có callback)
namespace SkillDo\Model;

use SkillDo\Traits\ModelRoute;

class ExModel extends Model
{
use ModelRoute;

protected string $table = 'ex_modal_table';

protected string $primaryKey = 'ex_modal_id';

public function __construct($attributes = [])
{
$this->route = [
'type' => 'post',
'callback' => 'ThisIsMethodView',
'dependent' => 'title'
];

parent::__construct($attributes);
}
}

callback hiển thị giao diện

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');
}
Liên kết ngôn ngữ 7.3.0

Để tạo liên kết với bảng language giúp đối tượng có tính đa ngôn ngữ bạn sử dụng trait ModelRoute, 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;

use SkillDo\Traits\ModelLanguage;

class ExModel extends Model
{
use ModelLanguage;

protected string $table = 'ex_modal_table';

protected string $primaryKey = 'ex_modal_id';
}

Để thiết lập liên kết bạn cần khai báo tên model cần liên kết vào table language bằng property language sau khi thêm ModelLanguage

namespace SkillDo\Model;

use SkillDo\Traits\ModelLanguage;

class ExModel extends Model
{
use ModelLanguage;

protected string $table = 'ex_modal_table';

protected string $primaryKey = 'ex_modal_id';

public function __construct($attributes = [])
{
$this->language = 'ExModel';

parent::__construct($attributes);
}
}
//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',
]
]
]);

Xóa dữ liệu

  • Để xóa một model, bạn có thể gọi phương thức remove trên model instance:
$page = SkillDo\Model\Page::find(1);
$page->remove();
  • Xóa model bằng Queries

Phương thức delete của model có thể được sử dụng để xóa các bản ghi khỏi bảng. Phương thức delete trả về số lượng hàng bị ảnh hưởng. Bạn có thể hạn chế các câu lệnh xóa bằng cách thêm Query Builder vào phương thức delete:

ExModel::delete(Qr::set()->where('id', '<=', 20));
//hoặc
ExModel::where('id', '<=', 20)->remove();
  • Bạn có thể gọi phương thức truncate để xóa tất cả dữ liệu của model. Thao tác truncate cũng sẽ đặt lại mọi ID auto-incrementing trên bảng được liên kết của model:
ExModel::truncate();

Soft Deleting

Ngoài việc thực sự xóa các bản ghi khỏi cơ sở dữ liệu của bạn, Model còn có thể "soft delete" các model. Khi các model bị xóa, chúng sẽ không thực sự bị xóa khỏi cơ sở dữ liệu của bạn. Thay vào đó, column trash cho biết model đã bị "xóa". Để bật tính năng "soft delete" cho một model, hãy thêm trait SkillDo\Traits\SoftDeletes vào model:

<?php
namespace SkillDo\Model;

use SkillDo\Traits\SoftDeletes;

class ExModel extends Model
{
use SoftDeletes;
}

Bạn cũng thêm cột trash vào cơ sở dữ liệu của mình.

if(!schema()->hasTable('ex_modal_table')) {
schema()->create('ex_modal_table', function (Blueprint $table) {
$table->tinyInteger('trash')->default(0);
});
}

Trash

Cho một đối tượng model vào thùng rác

$object = ExModel::find(1);
$object->trash();

Cho nhiều đối tượng model vào thùng rác

ExModel::whereKey([1,2,3,4,5])->trash();

withTrashed 7.3.2

Theo mặc định, bất kỳ Model nào có bật SoftDeletes cấu truy vẫn sẽ loại trừ các bản ghi bị xóa mềm. Tuy nhiên, có những trường hợp bạn có thể muốn bao gồm chúng. Để truy xuất cả bản ghi bị xóa mềm và không bị xóa trong một truy vấn, method withTrashed() được sử dụng.

SkillDo\Model\Post::withTrashed()->where('id', 12)->fetch();

onlyTrashed 7.3.2

Method onlyTrashed() làm ngược lại với withTrashed() Nó chỉ truy xuất các bản ghi bị xóa mềm. Phương pháp này hữu ích trong trường hợp bạn muốn quản lý hoặc khôi phục các mục bị xóa mềm.

SkillDo\Model\Post::onlyTrashed()->where('id', 12)->fetch();

Restore

Đôi khi bạn có thể muốn "bỏ xóa" một object đã xóa mềm. Để khôi phục một model đã bị xóa tạm thời, bạn có thể gọi phương thức restore

Khôi phục một đối tượng model

$object = ExModel::onlyTrashed()->first();
$object->restore();

Khôi phục nhiều đối tượng model

ExModel::onlyTrashed()->whereKey([1,2,3,4,5])->restore();

Events

Các event trong Model cho phép bạn tham gia vào các giai đoạn khác nhau trong vòng đời của một Model chẳng hạn như khi được tạo, cập nhật hoặc xóa.

retrieved

Khi một bản ghi được truy xuất từ database

class Post extends Model
{
/**
* The "booted" method of the model.
*
* @return void
*/
protected static function booted()
{
parent::boot();

static::retrieved(function ($post) {
if(!empty($post->content) && Str::isHtmlspecialchars($post->content)) {
$post->content = htmlspecialchars_decode($post->content);
}
});
}
}

creating

Trước khi một model được tạo (chưa lưu vào database).

class Post extends Model
{
protected static function booted()
{
parent::boot();

static::creating(function ($post) {
\SkillDo\SkillDo\Log::info('A new post is being created: ' . $post->title);
});
}
}

created

Sau khi một model được tạo (đã lưu vào database).

class Post extends Model
{
protected static function boot(): void
{
parent::boot();

static::created(function ($post) {
\SkillDo\SkillDo\Log::info('A new post was created: ' . $post->id);
});
}
}

updating

Trước khi một model được cập nhật.

class Post extends Model
{
protected static function boot(): void
{
parent::boot();

static::updating(function ($post) {
\SkillDo\Log::info('A post is being updated: ' . $post->id);
});
}
}

updated

Sau khi một model được cập nhật.

class Post extends Model
{
protected static function boot(): void
{
parent::boot();

static::updated(function ($post) {
\SkillDo\Log::info('A post is updated: ' . $post->id);
});
}
}

saving

Trước khi một model được lưu (bao gồm cả tạo và cập nhật).

class Post extends Model
{
protected static function boot(): void
{
parent::boot();

static::saving(function ($post, $action) {
if($action == 'add') {
\SkillDo\Log::info('A post is created: ' . $post->title);
}
if($action == 'update') {
\SkillDo\Log::info('A post is updated: ' . $post->id);
}
});
}
}

saved

Sau khi một model được lưu (bao gồm cả tạo và cập nhật).

class Post extends Model
{
protected static function boot(): void
{
parent::boot();

static::saved(function ($post, $action) {
if($action == 'add') {
\SkillDo\Log::info('A post is created: ' . $post->id);
}
if($action == 'update') {
\SkillDo\Log::info('A post is updated: ' . $post->id);
}
});
}
}

deleting

Trước khi một model bị xóa.

class Post extends Model
{
protected static function boot(): void
{
parent::boot();

static::deleting(function ($post, $listRemoveId, $objects) {
foreach ($listRemoveId as $id) {
\SkillDo\Log::info('A post is being deleted: ' . $id);
}
});
}
}

deleted

Sau khi một model bị xóa.

class Post extends Model
{
protected static function boot(): void
{
parent::boot();

static::deleted(function ($post, $listRemoveId, $objects) {
foreach ($listRemoveId as $id) {
\SkillDo\Log::info('A post is deleted: ' . $id);
}
});
}
}

trashing

Trước khi một model bị xóa mềm (chỉ áp dụng cho models sử dụng SoftDeletes).

class Post extends Model
{
protected static function boot(): void
{
parent::boot();

static::trashing(function ($post) {
\SkillDo\Log::info('A post is being trashed: ' . $post->id);
});
}
}

trashed

Sau khi một model bị xóa mềm (chỉ áp dụng cho models sử dụng SoftDeletes).

class Post extends Model
{
protected static function boot(): void
{
parent::boot();

static::trashed(function ($post) {
\SkillDo\Log::info('A post is trashed: ' . $post->id);
});
}
}

restoring

Trước khi một model bị khôi phục (chỉ áp dụng cho models sử dụng SoftDeletes).

class Post extends Model
{
protected static function boot(): void
{
parent::boot();

static::restoring(function ($post) {
\SkillDo\Log::info('A post is being restored: ' . $post->id);
});
}
}

restored

Sau khi một model bị khôi phục (chỉ áp dụng cho models sử dụng SoftDeletes).

class Post extends Model
{
protected static function boot(): void
{
parent::boot();

static::restored(function ($post) {
\SkillDo\Log::info('A post is restored: ' . $post->id);
});
}
}