我坚持这个看似简单的任务。
我的用户中有许多商店有很多产品..
我正在尝试为某个用户获取所有产品。
这是有效的,并且正在退回商店及其产品
\Auth::user()->shops()->with('products')->get();
但我需要一个只有产品的集合。我尝试了以下但是它搞乱了查询
\Auth::user()->shops()->with('products')->select('products.*')->get();
知道我做错了什么吗?谢谢!
答案 0 :(得分:15)
您可以使用:
\Auth::user()->shops()->with('products')->get()->pluck('products')->flatten();
如果您不想复制,可以使用->unique()
答案 1 :(得分:9)
您需要的是用户模型和产品模型之间的关系..
这可以使用hasManyThrough
关系..
用户模型
public function products()
{
return $this->hasManyThrough('App\Product', 'App\Shop')
}
现在,您可以使用
访问所有用户的产品Auth::user()->products;
答案 2 :(得分:3)
在这种情况下,您可以使用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();
在这两种情况下,您对数据库的查询次数都相同,因此我会在真实的应用中使用第一个示例。
答案 3 :(得分:-2)
假设您的产品型号已存储商店ID,请尝试以下操作:
Products::whereIn('id_shop',
Shops::select('id')
->where('id_owner_user',Auth::user()->id)
->get())
->get()
它将检索属于经过身份验证的用户
的商店列表的产品集合