【问题标题】:Laravel get a collection of relationship itemsLaravel 获取关系项的集合
【发布时间】:2017-10-10 02:43:24
【问题描述】:

我被困在这个看似简单的任务上。

我的用户拥有许多商店,拥有许多产品..

我正在尝试获取某个用户的所有产品。

这很有效,并且正在将商店连同他们的产品一起退回

\Auth::user()->shops()->with('products')->get();

但我只需要产品的集合。我尝试了以下方法,但它弄乱了查询

\Auth::user()->shops()->with('products')->select('products.*')->get();

知道我做错了什么吗?谢谢!

【问题讨论】:

  • Products::where('user_id', Auth::id())->get() 有什么问题?您还需要进入商店吗?

标签: php laravel eloquent


【解决方案1】:

假设您的产品型号已存储商店 ID,请尝试以下操作:

Products::whereIn('id_shop',
    Shops::select('id')
    ->where('id_owner_user',Auth::user()->id)
    ->get())
->get()

它将检索属于经过身份验证的用户的商店列表中的产品集合

【讨论】:

  • 这不使用关系或联接,这只是两个 SELECT 查询,一个在另一个内部作为参数运行,因此效率较低,而不是 OP 要求的
  • 他说:“但我只需要产品的集合。”如果您加入,您将拉动两个模型
  • 顺便说一句,对于那些投反对票的人来说,laravel 关系会产生一个像我和@DanielWaters 这样的查询,我今天读了很多关于它的内容,两个选择查询比一个连接更快。有一个好的编码伙伴
【解决方案2】:

在这种情况下你可以使用lazy eager loading:

auth()->user()->load('shops.products');

迭代产品:

@foreach (auth()->user()->shops as $shop)
    @foreach ($shop->products as $product)
        {{ $product->name }}
    @endforeach
@endforeach

如果您只需要产品:

Product::whereHas('shop', function ($q) {
    $q->where('user_id', auth()->id());
})->get();

在这两种情况下,您对 DB 的查询数量都相同,因此我将在实际应用中使用第一个示例。

【讨论】:

  • 我不是反对这个的人,但我认为这是因为 OP 正在询问如何在不使用商店的情况下访问产品..
  • @Demonowh 您的示例也创建了使用 shops 表的查询,因此它仍然使用商店。
  • @Notflip 我添加了另一个使用shop 关系的解决方案,即belongsTo()Product 模型中。
  • @Demonowh 如您所见,我已经在评论中谈到了这些问题。顺便说一句,在真正的应用程序中,您迟早会需要商店。
  • 我不是投反对票的人..这只是我的假设..我不知道他们为什么投反对票..对不起..
【解决方案3】:

您需要的是用户模型和产品模型之间的关系..

这可以使用hasManyThrough 关系..

用户模型

public function products()
{
    return $this->hasManyThrough('App\Product', 'App\Shop')
}

现在,您可以使用

访问所有用户的产品
Auth::user()->products;

【讨论】:

  • 感谢您的回答。问题是,也会有用户是供应商,但没有商店。所以这会发生冲突。
  • 那么在你的情况下..你的产品模型在数据库中也应该有一个 user_id 字段..然后将返回更改为 `$this->hasMany('App\Product');但这不是一个好习惯,因为您正在绕过模型关系的层次结构..
  • 值得注意的是,您可以使用 ->with('relationship') 来急切加载该关系
【解决方案4】:

你可以用这个:

\Auth::user()->shops()->with('products')->get()->pluck('products')->flatten();

如果不想复制,可以使用->unique()

如果您想直接处理查询(用于表演):


 Product::whereHas('shops', function($query){
    $query->where('user_id', auth()->user()->id);
 })->get();

【讨论】:

  • 完美!刚刚好!不知道采摘
  • 干杯!这只是将我从一个非常迂回的优化路径中解救出来。
  • 是否可以在另一个查询中使用products?我的意思是,如何对那些products 进行分页...谢谢。
  • 我编辑我的答案来回答这个问题:)
猜你喜欢
  • 2020-06-02
  • 1970-01-01
  • 2021-07-10
  • 2019-06-17
  • 1970-01-01
  • 1970-01-01
  • 2021-09-09
  • 1970-01-01
  • 2021-06-11
相关资源
最近更新 更多