与Laravel / Eloquent的多对多关系

时间:2014-07-25 10:45:16

标签: php laravel eloquent

我认为我在很大程度上理解了Eloquent,但是我仍然很难理解许多关系。

我正在设计一个示例数据库,希望大家可以帮助我理解正确的方法。

表1 类别

  • cat_id
  • cat_name

表2:图库

  • gallery_id
  • gallery_name

表3: galleryCategories

  • cat_id
  • gallery_id

那我该怎么做我的模特?我发现了这个话题,但它看起来并不合适。也许是因为它比我需要的关系更复杂一些。我认为这种逻辑使我感到困惑,因为我希望产品具有术语,而在该示例中,产品具有产品。

如果你能用我的样本解释它,它将帮助我更好地理解belongsToMany()hasMany()方法及其参数。我还对一些没有采用任何外键参数的例子感到困惑。

谢谢!

1 个答案:

答案 0 :(得分:1)

要使其适用于您的架构,您需要:

// Category model
protected $primaryKey = 'cat_id';

public function galleries()
{
  return $this->belongsToMany('Gallery', 'galleryCategories', 'gallery_id', 'cat_id');
}

// Gallery model
protected $primaryKey = 'gallery_id';

public function categories()
{
  return $this->belongsToMany('Category', 'galleryCategories', 'cat_id', 'gallery_id');
}

// then:
$category = Category::first();
$category->galleries; // collection of Gallery models

要使其符合Eloquent约定,您需要:

// tables
categories: id, ...
galleries: id, ...
category_gallery: id, category_id, gallery_id [, timestamps]

// models
// Category
public function galleries()
{
  return $this->belongsToMany('Gallery');
}

// Gallery
public function categories()
{
  return $this->belongsToMany('Category');
}

如果您想要构建大部分框架,第二种解决方案会更好,但如果您想依赖于您的架构,那么您可以根据它进行Eloquent调整。


注意:hasMany是1-m关系,belongsTo是其对应关系,而对于与数据透视表的多对多关系,您在两端使用belongsToMany