我有三个表categories
、film_categories
和films
以及三个模型,分别是Category
、FilmCategory
和Film
。
我看过很多教程,他们没有像我创建FilmCategory
模型那样创建pivot table model
,他们只是创建了一个没有模型的透视表film_categories
。
我的问题是什么是最好的做法-?
我是否应该创建FilmCategory
模型并设置hasMany
关系
class Film extends Model
{
use HasFactory;
protected $primaryKey = 'film_id';
/**
* Film film Relationship
*
* @return Illuminate\Database\Eloquent\Relations\HasMany
*/
public function categories()
{
return $this->hasMany(FilmCategory::class, 'film_id', 'film_id');
}
}
- 或**
我应该创建一个没有模型FilmCategory
的透视表film_categories
并设置belongsToMany
关系吗
class Film extends Model
{
use HasFactory;
protected $primaryKey = 'film_id';
/**
* Film film Relationship
*
* @return Illuminate\Database\Eloquent\Relations\HasMany
*/
public function categoriesWithPivot()
{
return $this->belongsToMany(Category::class, 'film_categories', 'film_id', 'category_id');
}
}
2条答案
按热度按时间enyaitl31#
从技术上讲,两个选项都可以。你可以实现它们中的两个,并且根据你想在代码的逻辑部分实现/实现什么,使用两个选项中最适合的一个。下面是需要考虑的事情:
首先要看
film_categories
表是做什么用的,如果表的存在只是为了将films
和categories
表以多对多的关系关联起来,那么就不需要创建FilmCategory
模型,直接使用belongsToMany()
即可,否则,如果film_categories
要关联到另一个表。那么您应该创建FilmCategory
模型并使用hasMany()
定义关系。如果是这种情况,您还可能需要向film_categories
添加主键字段。第二个需要考虑的问题是你想要什么样的数据结构,使用你提供的代码,你可以通过下面两个查询得到
Film
,它会给你正确的值,但是结构不同:就是这样。第一点比第二点更重要。但是选择权完全在你。我希望这能有所帮助。
eagi6jfj2#
由于film_categories表不代表系统中的实体,我认为您应该定义belongsToMany关系,而不应该为透视表创建单独的模型。如果您仍然希望为透视表创建一个模型,请创建一个扩展Illuminate\Database\Eloquent\Relations\Pivot类的模型。请在此处查看文档:透视表模型