为什么Laravel关系的名称惯例如此奇怪?

时间:2016-09-23 08:00:03

标签: php laravel laravel-5

我有三张桌子:

  • 用户
    • columns:id,name
  • 书籍
    • columns:id,name
  • book_user:
    • 列:user_id,book_id,州(not read yetreadingread already

我打算将book_user用作多对多关系表,因此我遵循doc中的名称约定:

  

要定义此关系,需要三个数据库表:用户角色 role_user 。 role_user表派生自相关模型名称的字母顺序,并包含user_id和role_id列。

我写了代码:

class User extends Model
{
    public function books()
    {
        return $this->belongsToMany('App\Book');
    }
}

,我可以通过电话user->books()检索与用户相关的图书。

效果很好,但是当我尝试检索与用户相关的图书状态时,我创建了模型:

class BookUser extends Model
{
    //
}

当我使用此模型时,它声称:

Base table or view not found: 1146 Table 'myapp.book_users' doesn't exist

结论:

  • 可以用作多对多的表的名称约定为<singular_noun>_<singular_noun>(例如book_user)。
  • 表格的名称约定,其中包含多个映射到模型的单词<singular_noun>_<plural_noun>(例如book_users)。

我知道我可以手动设置一个模型映射的表名,但我只是想知道:

这种冲突是设计缺陷还是我在设计表格和模型时做错了?

2 个答案:

答案 0 :(得分:1)

您不需要为数据透视表定义模型,只需添加withPivot

即可
copy()

然后您可以从模型数据透视中检索图书状态

答案 1 :(得分:1)

通常,您不需要数据透视表的模型。您可以定义关系的倒数。如果您想在数据透视表中存储额外数据,可以检查withPivot方法。或者解释你想做什么。

但是如果要创建模型,则需要手动在模型中指定表名。因为Laravel不知道它是一个数据透视表还是普通表。它只是试图通过使表复数来猜测表名。