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、状态(
      尚未阅读
      正在阅读
      已阅读
我打算使用
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
from
user->book
change
return$this->belongTomany('App\book')
to
return$this->hasMany('App\Book')
并在您拥有
$this->belongsTo('App\User')
App\Book
模型上创建反向操作。一个用户可以拥有许多书籍,因此您的关系应该是
hasMany
from
User->Book
change
return$this->belongsToMany('App\Book')
to
return$this->hasMany('App\Book')
并在您拥有
$this->belongsTo('App\User')
App\Book
模型上创建reverseAssocation。