Php 为什么拉威尔关系的命名惯例如此怪异?
我有三张桌子:Php 为什么拉威尔关系的命名惯例如此怪异?,php,laravel,laravel-5,Php,Laravel,Laravel 5,我有三张桌子: 使用者 列:id,name 书 列:id,name 图书用户: 列:用户id、书籍id、状态(尚未阅读,正在阅读,已阅读) 我打算使用book\u user作为多对多关系表,因此我遵循以下名称约定: 要定义此关系,需要三个数据库表:用户,角色,以及角色_用户。role_user表根据相关模型名称的字母顺序派生,并包含user_id和role_id列 我写了代码: class User extends Model { public function book
- 使用者
- 列:id,name
- 书
- 列:id,name
- 图书用户:
- 列:用户id、书籍id、状态(
,尚未阅读
,正在阅读
)已阅读
- 列:用户id、书籍id、状态(
book\u 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
结论:
- 可以多对多使用的表的名称约定是
(例如
)book\u user
- 映射到模型的具有多个单词的表的名称约定为
(例如
)book\u users
这种冲突是设计缺陷还是我在设计表和模型时犯了错误?您不需要为透视表定义模型,只需添加withPivot即可
class User extends Model
{
public function books()
{
return $this->belongsToMany('App\Book')->withPivot('state');
}
}
然后您可以从模型透视中检索书籍状态您不需要为透视表定义模型,只需添加withPivot即可
class User extends Model
{
public function books()
{
return $this->belongsToMany('App\Book')->withPivot('state');
}
}
然后,您可以从模型透视中检索书籍状态。通常情况下,透视表不需要模型。您可以定义关系的倒数。若你们想在pivot表中存储额外的数据,也许你们可以用pivot方法检查
。或者解释你想做什么
但如果要创建模型,则需要在模型中手动指定表名。因为Laravel不知道它是透视表还是普通表。它只是通过将表名设为复数来猜测表名。通常,透视表不需要模型。您可以定义关系的倒数。若你们想在pivot表中存储额外的数据,也许你们可以用pivot方法检查。或者解释你想做什么
但如果要创建模型,则需要在模型中手动指定表名。因为Laravel不知道它是透视表还是普通表。它只是尝试通过复数形式猜测表名。一个用户可以有很多书,因此您的关系应该是hasMany
fromuser->book
changereturn$this->belongTomany('App\book')
toreturn$this->hasMany('App\Book')
并在您拥有$this->belongsTo('App\User')
的App\Book
模型上创建反向操作。一个用户可以拥有许多书籍,因此您的关系应该是hasMany
fromUser->Book
changereturn$this->belongsToMany('App\Book')
toreturn$this->hasMany('App\Book')
并在您拥有$this->belongsTo('App\User')
的App\Book
模型上创建reverseAssocation。