我正在尝试检查用户是否已经喜欢某个地方,因此我需要检查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');
}
}
答案 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个关系
因此,将来很容易在数据透视表本身之间导航关系。即使您大部分时间不会直接接触数据透视模型/表格。
答案 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。