Laravel获得了一系列关系项目

时间:2017-05-11 07:56:10

标签: php laravel eloquent

我坚持这个看似简单的任务。

我的用户中有许多商店有很多产品..

我正在尝试为某个用户获取所有产品。

这是有效的,并且正在退回商店及其产品

\Auth::user()->shops()->with('products')->get();

但我需要一个只有产品的集合。我尝试了以下但是它搞乱了查询

\Auth::user()->shops()->with('products')->select('products.*')->get();

知道我做错了什么吗?谢谢!

4 个答案:

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

它将检索属于经过身份验证的用户

的商店列表的产品集合