Mig*_*ens 11 php laravel eloquent
我坚持这个看似简单的任务.
我有一个用户,有很多商店有很多产品..
我正在尝试为某个用户获取所有产品.
这是有效的,并将商店与他们的产品一起归还
\Auth::user()->shops()->with('products')->get();
Run Code Online (Sandbox Code Playgroud)
但我需要一个只收集产品的集合.我尝试了以下但是它搞乱了查询
\Auth::user()->shops()->with('products')->select('products.*')->get();
Run Code Online (Sandbox Code Playgroud)
知道我做错了什么吗?谢谢!
Mat*_*rre 25
你可以用这个:
\Auth::user()->shops()->with('products')->get()->pluck('products')->flatten();
Run Code Online (Sandbox Code Playgroud)
如果你不想复制,你可以使用 ->unique()
您需要的是用户模型和产品模型之间的关系.
这是可能的使用hasManyThrough关系..
用户模型
public function products()
{
return $this->hasManyThrough('App\Product', 'App\Shop')
}
Run Code Online (Sandbox Code Playgroud)
现在,您可以访问所有用户的产品
Auth::user()->products;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您可以使用延迟加载:
auth()->user()->load('shops.products');
Run Code Online (Sandbox Code Playgroud)
迭代产品:
@foreach (auth()->user()->shops as $shop)
@foreach ($shop->products as $product)
{{ $product->name }}
@endforeach
@endforeach
Run Code Online (Sandbox Code Playgroud)
如果您只需要产品:
Product::whereHas('shop', function ($q) {
$q->where('user_id', auth()->id());
})->get();
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,您都会对数据库进行相同数量的查询,因此我将在实际应用程序中使用第一个示例。