Laravel Tutorial

Bài 27: Eloquent Model trong Laravel

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