Eloquent model là một module trong Laravel core. Nó là một object-relational mapper (ORM) nó giúp cho chúng ta tương tác với dữ liệu trong database một cách đơn giản linh hỏạt hơn.
Khi sử dụng Eloquent thì mỗi một table trong database sẽ được gán với một model. Và chúng ta có thể tương tác với dữ liệu trong bảng đó như đọc, thêm, sửa và xóa (CRUD) qua Eloquent model
1. Tạo eloquent model trong Laravel
Mặc định, trong Laravel tất cả các model đều nằm trong thư mục app\Models
và các model đều phải kế thừa Illuminate\Database\Eloquent\Model class
Ví dụ: Tạo model Flight
php artisan make:model Flight
Kết quả file Flight.php
sẽ được sinh ra trong thư mục app/Models
sẽ có dạng như sau:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
//
}
Nếu như bạn vừa muốn tạo ra một model và đồng thời tạo thêm một migration nữa, bạn có thể thêm flag --migration
hoặc -m
Ví dụ: Tạo model Flight
và đồng thời tạo thêm migration cho table flights
php artisan make:model Flight --m
Tương tự:
- Tạo model và seeder đồng thời bằng cách sử dụng flag
--seed
hoặc-m
- Tạo model và factory đồng thời bằng cách sử dụng flag
--factory
hoặc-f
- Tạo model và controller đồng thời bằng cách sử dụng flag
--controller
hoặc-c
Nếu như bạn muốn tạo model đồng thời tạo thêm cả migration, factory, seed và controller các bạn có thể sử dụng flag -mfsc
php artisan make:model Flight -mfsc
2. Cấu hình eloquent model
# Table name
Mặc định thì model sẽ sử dụng tên bảng là tên của của model nhưng được viết dưới dạng snake_case và thể hiện ở dạng số nhiều
Ví dụ: Đối với model Flight
vừa tạo ở trên thì table name sẽ là flights
, hoặc model name là AirTrafficController
thì table name sẽ là air_traffic_controllers
Bạn có thể xác định table name thủ công bằng cách gán chúng vào trong thuộc tính $table
Ví dụ: Định nghĩa table name của model Flight
là my_flights
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
protected $table = 'my_flights';
}
# Primary key
Mặc định Laravel nhận định column id sẽ là khóa chính trong model, nếu bạn muốn thay đổi cột khóa chính, bạn có thể định nghĩa chúng ở trong thuộc tính $primaryKey
Ví dụ: Định nghĩa khóa chính của model Flight
thành flight_id
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
protected $primaryKey = 'flight_id';
}
Ngoài ra thì Laravel mặc định sẽ coi khóa chính có kiểu dữ liệu là increment và khi sử dụng khóa chính Laravel sẽ tự convert khóa chính thành kiểu số. Nếu như khóa chính của bạn không phải là increment hoặc bạn không muốn ép khóa chính về kiểu số, bạn có thể thiết lập thược tính $incrementing
về false
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
public $incrementing = false;
}
Bạn có thể xác định lại kiểu dữ liệu cho nó bằng cách định nghĩa trong thuộc tính $keyType
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
protected $keyType = 'string';
}
# Timestamp
Mặc định, Laravel sẽ coi như trong table của bạn có 2 column created_at
và updated_at
, và sẽ mặc định set giá trị cho 2 cột dữ liệu này cho các trường hợp tạo mới, update dữ liệu trong bảng. Nếu bạn không muốn Laravel làm việc này bạn có thể thiết lập thuộc tính $timestamps
về false
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
public $timestamps = false;
}
Nếu bạn vẫn muốn Laravel tự động thiết lập giá trị cho 2 cột dữ liệu để xác định thời gian tạo và sửa của bản ghi trong database, nhưng 2 cột dữ liệu của bạn không phải là created_at
và updated_at
. Bạn có thể thay đổi nó
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
const CREATED_AT = 'creation_date';
const UPDATED_AT = 'updated_date';
}
# Giá trị mặc định
Mặc định khi chúng ta instance một model class thì nó sẽ không chứa giá trị của một attribute nào, nếu như bạn muốn xác định các giá trị mặc định cho attribute nào đó bạn có thể thiết lập chúng ở trong thuộc tính $attributes
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
protected $attributes = [
'delayed' => false,
];
}
Chú ý: attribute ở đây chính là column trong table trong database
# Database connection
Ví dụ: Chuyển connection của model Flight
sang sqltie
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
protected $connection = 'sqlite';
}
Leave a Comment