我是要在Laravel中为中间表创建模型吗?

时间:2019-05-16 14:14:27

标签: php laravel eloquent

我正在尝试检查用户是否已经喜欢某个地方,因此我需要检查Place_User表中是否已有记录。但是,到目前为止,我还没有为中间表创建模型。我什至不知道如何命名模型。 Place_User对型号名称有意义吗?

我有以下3张桌子:

Table: Users
Columns: id, username, password

Table: Places
Columns: id, place_id

Table: Place_User
Columns: id, user_id, place_id

我也有以下2种型号:

class User extends \Eloquent implements Authenticatable
{
    use AuthenticableTrait;

    public function places(){
        return $this->belongsToMany('App\Place');
    }
}

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

4 个答案:

答案 0 :(得分:4)

对于多对多关系,您不需要额外的模型。您可以轻松地检查用户是否已经喜欢这样的地方:

User::find(1)->places->contains($placeId);

// or

User::find(1)->places()->where('place_id', $placeId)->exists();

答案 1 :(得分:1)

您可以在User模型中为数据透视表添加方法,因为它适合您的情况:

public function user_places()
{
    return $this->belongsToMany('App\Place', 'place_user', 
      'user_id', 'place_id');
}

我建议使用表的复数名称,以提高laravel的可读性。

答案 2 :(得分:0)

是的,您应该为数据透视表创建模型。 没有关联模型的悬挂式表并不是我的真正选择。尽管命名它们可能有点困难,但为简单起见,我建议使用UserPlaces

为什么要创建模型?这样您就可以在UserPlace模型中定义2个关系

  1. 用户
  2. 地点

因此,将来很容易在数据透视表本身之间导航关系。即使您大部分时间不会直接接触数据透视模型/表格。

答案 3 :(得分:0)

Laravel 5.8的最新版本提供了有关以下主题的文档:https://laravel.com/docs/5.8/eloquent-relationships#defining-custom-intermediate-table-models

但是我不认为数据透视表应该具有模型。
模型代表您的应用实体。数据透视表就在那里存储实体之间的关系。

如果您只需要检查关系的存在,则已经有必需的工具:

$hasPlace = User::find(1)->places()->where(/* ... */)->exists();

如果您确实需要数据透视表使用模型,则可以,但是我认为在大多数情况下,您需要重新考虑数据库的Shema。