Laravel获得了一系列关系项目

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()


Dem*_*owh 9

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

这是可能的使用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)


Ale*_*nin 6

在这种情况下,您可以使用延迟加载

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)

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