【问题标题】:Laravel Eloquent Distant Relationship SetupLaravel Eloquent 远程关系设置
【发布时间】:2019-01-27 20:12:05
【问题描述】:

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

Favorite.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。

看起来我可能需要“有很多通过”关系来实现这个查询,但我不确定如何在这个用例中实现它,或者即使“有很多通过”关系这样做的正确方法是什么?

【问题讨论】:

  • 请对答案提供反馈。
  • @JonasStaudenmeir 我还没有实施这个项目,因为截止日期已被推迟,它们看起来都是有效的选项,所以对于哪个是最好的实施,这是一个见仁见智的问题。在我尝试了这些选项之前,我不想发表我的个人意见。

标签: php laravel eloquent


【解决方案1】:

在建立关系时,您可以让一个用户拥有多个文档,他也可以将多个文档设为他的收藏夹。所以它总是会返回一个数组。为了加载用户最喜欢的所有文档,您可以像开始时一样执行此操作:

$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.
}

有许多直通关系用于从您无法直接访问的表中获取项目。但是对于您的两个表,您都可以直接连接到用户。

【讨论】:

    【解决方案2】:

    你对 has-many-through 是正确的,所以用户:

    return $this->hasManyThrough('App\Document', 'App\Favourite');
    

    在文档上:

    return $this->hasManyThrough('App\User', 'App\Favourite');
    

    Eloquent Docs

    【讨论】:

      【解决方案3】:

      您的收藏夹表是数据透视表。您不需要收藏夹模型。

      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.

      【讨论】:

        猜你喜欢
        • 2018-07-19
        • 2022-06-10
        • 1970-01-01
        • 2012-09-27
        • 1970-01-01
        • 2017-12-27
        • 2016-08-13
        • 2018-02-09
        • 2020-10-14
        相关资源
        最近更新 更多