我有三个表,一个用户表,文档表和一个收藏夹表。这个想法是用户可以收藏文档,但是我无法理解使用Eloquent进行查询的最佳方法。
User.php
class User extends Authenticatable
{
public function documents()
{
return $this->hasMany('App\Document');
}
public function favourites()
{
return $this->hasMany('App\Favourite');
}
}
Document.php
class Document extends Model
{
public function user()
{
return $this->belongsTo('App\User');
}
}
Favourite.php
class Favourite extends Model
{
public function user()
{
return $this->belongsTo('App\User');
}
public function document()
{
return $this->belongsTo('App\Document');
}
}
收藏夹表是一个简单的2列表,其中的user_id和document_id将每个用户链接到他们喜欢的文章。
现在,我可以使用一种方法来获得用户喜欢的文章,例如:
App\User::with('favourites')->find(1);
问题是当我想要来自文档表的数据(例如文档的标题和ID)时,这会从“收藏夹”表中带回两个ID。
看来,“具有多次通过”关系是实现此查询所需要的,但是我不确定如何在此用例中实现,即使“具有多次通过”关系也是如此正确的方法是什么?
答案 0 :(得分:0)
在建立关系时,您可以拥有一个拥有多个文档的用户,并且他也可以创建多个文档作为他的收藏夹。因此它将始终返回一个数组。为了加载用户最喜欢的所有文档,您可以像开始时一样进行操作:
$favoriteDocuments = App\User::with('favourites.document')->find($userId = 1)->get();
// this will contain all the favorite documents for the user, so you can the iterate over them:
foreach($favoriteDocuments as $favoriteDocument)
{
// $favoriteDocument->document; is the object you are looking for.
}
使用许多直通关系是为了从无法直接访问的表中获取项目。但是,对于您的两个表,您都可以直接与用户建立联系。
答案 1 :(得分:0)
您对has-man-through是正确的,所以用户:
return $this->hasManyThrough('App\Document', 'App\Favourite');
在文档上:
return $this->hasManyThrough('App\User', 'App\Favourite');
答案 2 :(得分:0)
您的收藏夹表是数据透视表。您不需要收藏夹模型。
User.php
public function favoriteDocuments()
{
return $this->BelongsToMany('App\Document', 'favorite_documents');
}
现在,您可以致电$user->favoriteDocuments
来获取用户文档。
请参阅有关多对多关系的文档。 https://laravel.com/docs/5.7/eloquent-relationships#many-to-many。