如何获得所有关系收集?

时间:2019-01-12 16:24:47

标签: php laravel laravel-5 laravel-5.7

我有3个模型:

  • 公司,类别,产品。
  • 公司类别和产品类别之间有很多关系

如何从公司获得所有产品?

我的代码:

$company = Company::findOrFail($id);
if (isset($company->categories)){
    $categories = $company->categories;
    if (isset($categories->first()->products)){
        $products = $categories->first()->products;
    }
}

但是我的代码仅返回第一类产品。

2 个答案:

答案 0 :(得分:2)

这里有些错误。

首先,您需要eager Load关系,以避免N + 1查询问题。

第二,如果要访问属于所有类别的所有产品,则不能在类别关系上调用first()。相反,您需要遍历它。

以下应能工作。

$company = Company::with('categories.products')
    ->findOrFail($id);

if ($company)) {
    foreach ($company->categories as $category) {
        foreach ($category->products as $product) {
            // Access your Product model here
        }
    }
}

答案 1 :(得分:0)

也许你可以做到

 $company = Company::findOrFail($id);
 $categories_ids = $company->category->pluck('id');
 $products = Product::whereIn('category_id',$categories_ids')->get();

您也许可以使用hasThrouthMany

class Category extends Model
{
    public function posts()
    {
        return $this->hasManyThrough(
            'App\Product',
            'App\Company',
            'category_id', // Foreign key on company table...
            'company_id', // Foreign key on product table...
            'id', // Local key on category table...
            'id' // Local key on company table...
        );
    }
}

您可以在https://laravel.com/docs/5.7/eloquent-relationships#has-many-through

中阅读更多信息。

请尝试一下,让我知道它如何工作:)