Model (Relationships trong Laravel)

Model (Relationships trong Laravel)

Model :
Các đặt tên :
-Là danh từ số ít (vd: User)
-Mỗi model tương ứng với 1 table trong DB
-Phương thức ở model phải ở dạng camelCase (vd: scopePopular)
loquent ORM  (object ralational mapping)là kỹ thuật ánh xạ các dữ liệu trong hệ quản trị cơ sở dữ liệu sang dạng đối tượng .
Eloquent Model là một module trong laravel core (giống model ở trong MVC)
+ Khi sử dụng Eloquent thì mỗi một table trong DB 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. php artisan make:model TênModel
    +Cấu hình tên table :
    Mặc định khi tạo Model  trong laravel, tên table sẽ được quy ước mặc định theo cú pháp :
  • chuyển thành chữ thường
  • Mỗi chữ cách nhau bởi dấu gạch dưới
  • Dạng số nhiều
    vd : Name model : ProductCategory => sẽ tự động chuyển thành : product_categories

1/ các mối quan hệ trong laravel

  • One to one (1 :1)
    1 người <=> 1 avatar và ngược lại 1 avata chỉ đại diện cho  1 người
    Model User :
    public function avatar()
    {
    return $this->hasOne('App\Avatar');
    }

Khi đó ta nếu muôn lấy avata của user có Id = 1 thì ta chỉ cần :
$avatar = User::find(1)->avatar;

  • chú ý Eloquent sẽ tự động match cột khóa ngoại user_id của bảng Avatar tương ứng với trường id của User. Nếu trường hợp khóa ngoại ko đặt là user_id mà đặt tên khác thì cần truyền thêm tham số thứ 2 :
    return $this->hasOne('App\Avatar', 'foreign_key');
  • Nếu khóa chính của User không đặt là id thì cũng cần truyền tham số thứ 3 .
    return $this->hasOne('App\Avatar', 'foreign_key', 'local_key');

Inverse (ngược lại ở bảng avatar)
Tương tụ thay hasOne => belongsTo(thuộc về)
protected $table = 'avatar';
public function user()
{
$this->belongsTo('App\User');
}
return $this->belongsTo('App\User', 'foreign_key');
return $this->belongsTo('App\User', 'foreign_key', 'other_key');
2/ One to many (biều thị mối quan hệ cha - con)
vd : user có nhiều bài post
public function posts()
{
return $this->hasMany('App\Post');
}

Tương tự như 1-1
$user = App\User::find(1)->posts;

Ngược lại bảng post :
public function user()
{
return $this->belongsTo('App\User');
}

3/ Many to many
1 produc thược nhiều order, 1 order nhiều produc

  • default eloquen sẽ tạo bảng thứ 3(bảng trung gian) có tên mặc định order_product và đồng thời chưa 2 cột
    order_id và product_id.
    public function orders()
    {
    return $this->belongsToMany('App\Order');
    }

public function product()
{
return $this->belongsToMany('App\Product');
}
-Muốn lấy  được 1 product có bao nhiêu order :
$orders = App\Product::find(1)->orders;

  • Để làm việc được với bảng trung gian này chúng ta sử dụng thuộc tính pivot
    $product = App\Product::find(1);

foreach($product->orders as $order)
{
echo $order->pivot->created_at; // mặc định Eloquent chỉ lấy được trưởng created_at và updated_at
}

Nếu muốn lấy ra trường khác thì cần khai báo thêm :
return $this->belongsToMany('App\Product')->withPivot('address');

Hoặc nếu muốn created_at và updated_at của pivot tự động cập nhật thì thêm :
return $this->belongsToMany('App\Product')->withTimestamps();

Nếu muốn lấy ra dữ liệu bảng pivot + kèm điều kiện
public function products()
{
return $this->belongsToMany(Product::class)->wherePivot('price', '>', 20000);
}
x
4/ Has One Through
Là mối quan hệ liên kết các bảng với nhau thông qua một bảng trung gian