Php Laravel获取一组关系项
我被困在这个看似简单的任务上 我有一个用户,他有很多商店,有很多产品。 我正在尝试为某个用户获取所有产品 这是有效的,并返回商店与他们的产品Php Laravel获取一组关系项,php,laravel,eloquent,Php,Laravel,Eloquent,我被困在这个看似简单的任务上 我有一个用户,他有很多商店,有很多产品。 我正在尝试为某个用户获取所有产品 这是有效的,并返回商店与他们的产品 \Auth::user()->shops()->with('products')->get(); 但我只需要一套产品。我尝试了以下方法,但它把查询搞乱了 \Auth::user()->shops()->with('products')->select('products.*')->get(); 知道我做错了什么
\Auth::user()->shops()->with('products')->get();
但我只需要一套产品。我尝试了以下方法,但它把查询搞乱了
\Auth::user()->shops()->with('products')->select('products.*')->get();
知道我做错了什么吗?谢谢大家! 假设您的产品型号存储了店铺id,请尝试以下操作:
Products::whereIn('id_shop',
Shops::select('id')
->where('id_owner_user',Auth::user()->id)
->get())
->get()
它将检索属于已验证用户的商店列表的产品集合在这种情况下,您可以使用:
要迭代产品,请执行以下操作:
@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();
如果您只需要产品:
@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的查询数量相同,因此我将在实际应用程序中使用第一个示例。您需要的是用户模型和产品模型之间的关系 这可以通过使用
hasManyThrough
关系实现
用户模型
public function products()
{
return $this->hasManyThrough('App\Product', 'App\Shop')
}
现在,您可以使用访问用户的所有产品
Auth::user()->products;
您可以使用以下选项:
\Auth::user()->shops()->with('products')->get()->pluck('products')->flatten();
如果不想复制,可以使用->unique()
如果要直接处理查询(用于性能):
这不使用关系或连接,这只是两个选择查询,一个在另一个内部运行,作为参数,因此效率较低,而不是OP askedHe所说的:“但我只需要产品的集合。”如果进行连接,则会拉两个modelsBTW,对于那些被否决的人,laravel关系产生了一个像我和@DanielWaters这样的查询,我今天读了很多关于它的文章,两个select查询比连接更快。拥有一个好的编码matesim不是那个否决这一点的人,但我认为这是因为OP询问如何在不使用商店的情况下访问产品。@demonyow您的示例也创建了使用
商店
表的查询,所以它还是使用商店。@Notflip我添加了另一个解决方案,它使用了shop
关系,即Product
模型中的belongsTo()
。@demonyow正如你所看到的,我在我的评论中对查询所说的。顺便说一句,在一个真正的应用程序中,你迟早会需要商店。我不是那个否决这个的人。。这只是我的假设。。我不知道他们为什么否决了这个。。对不起,谢谢你的回答。问题是,还有一些用户是中的供应商,但没有店铺。。那就对了。那么在你的情况下。。您的产品模型在数据库中还应该有一个用户id字段。。然后将返回值更改为“$this->hasMany('App\Product');但这不是一个好的做法,因为您绕过了模型关系的层次结构。值得注意的是,您可以使用->with('relationship')来快速加载该关系Products::where('user\u id',Auth::id())->get()
?你也需要去商店吗?太好了!太完美了!我不知道那些欢呼声!这将我从一个非常迂回的优化路径中解救出来。是否可以在另一个查询中使用产品
?我的意思是,如何为那些产品
。。。谢谢。我编辑我的答案来回答这个问题:)