我有三张桌子:
not read yet
,reading
,read 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
)。我知道我可以手动设置一个模型映射的表名,但我只是想知道:
这种冲突是设计缺陷还是我在设计表格和模型时做错了?
答案 0 :(得分:1)
您不需要为数据透视表定义模型,只需添加withPivot
即可copy()
然后您可以从模型数据透视中检索图书状态
答案 1 :(得分:1)
通常,您不需要数据透视表的模型。您可以定义关系的倒数。如果您想在数据透视表中存储额外数据,可以检查withPivot
方法。或者解释你想做什么。
但是如果要创建模型,则需要手动在模型中指定表名。因为Laravel不知道它是一个数据透视表还是普通表。它只是试图通过使表复数来猜测表名。