Laravel口才多对多关系透视表

hs1rzwqc  于 2023-02-05  发布在  其他
关注(0)|答案(2)|浏览(144)

我有三个表categoriesfilm_categoriesfilms以及三个模型,分别是CategoryFilmCategoryFilm
我看过很多教程,他们没有像我创建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');
    }
}
enyaitl3

enyaitl31#

从技术上讲,两个选项都可以。你可以实现它们中的两个,并且根据你想在代码的逻辑部分实现/实现什么,使用两个选项中最适合的一个。下面是需要考虑的事情:
首先要看film_categories表是做什么用的,如果表的存在只是为了将filmscategories表以多对多的关系关联起来,那么就不需要创建FilmCategory模型,直接使用belongsToMany()即可,否则,如果film_categories要关联到另一个表。那么您应该创建FilmCategory模型并使用hasMany()定义关系。如果是这种情况,您还可能需要向film_categories添加主键字段。
第二个需要考虑的问题是你想要什么样的数据结构,使用你提供的代码,你可以通过下面两个查询得到Film,它会给你正确的值,但是结构不同:

Film::with('categoriesWithPivot')->get();
// Each record will have `Film`, `Category`, and its pivot of `film_categories` table

// OR

// Assuming that `FilmCategory` model has `belongsTo` relation to `Category` ...
Film::with('categories', 'categories.category')->get();
// Will gives you the same content-values as the above, but with in a different structure

就是这样。第一点比第二点更重要。但是选择权完全在你。我希望这能有所帮助。

eagi6jfj

eagi6jfj2#

由于film_categories表不代表系统中的实体,我认为您应该定义belongsToMany关系,而不应该为透视表创建单独的模型。如果您仍然希望为透视表创建一个模型,请创建一个扩展Illuminate\Database\Eloquent\Relations\Pivot类的模型。请在此处查看文档:透视表模型

相关问题