Laravel雄辩的远距离关系设置

时间:2019-01-27 20:12:05

标签: php laravel eloquent

我有三个表,一个用户表,文档表和一个收藏夹表。这个想法是用户可以收藏文档,但是我无法理解使用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。

看来,“具有多次通过”关系是实现此查询所需要的,但是我不确定如何在此用例中实现,即使“具有多次通过”关系也是如此正确的方法是什么?

3 个答案:

答案 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');

Eloquent Docs

答案 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