我有3个模型:
如何从公司获得所有产品?
我的代码:
$company = Company::findOrFail($id);
if (isset($company->categories)){
$categories = $company->categories;
if (isset($categories->first()->products)){
$products = $categories->first()->products;
}
}
但是我的代码仅返回第一类产品。
答案 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
中阅读更多信息。请尝试一下,让我知道它如何工作:)