Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel获取一组关系项_Php_Laravel_Eloquent - Fatal编程技术网

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()
?你也需要去商店吗?太好了!太完美了!我不知道那些欢呼声!这将我从一个非常迂回的优化路径中解救出来。是否可以在另一个查询中使用
产品
?我的意思是,如何为那些
产品
。。。谢谢。我编辑我的答案来回答这个问题:)