Php 如何获取所有关系集合?

Php 如何获取所有关系集合?,php,laravel,laravel-5,laravel-5.7,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 = $cate

我有3种型号:

  • 公司、类别、产品
  • 公司类别和产品类别之间有很多关系
如何从公司获得所有产品

我的代码:

$company = Company::findOrFail($id);
if (isset($company->categories)){
    $categories = $company->categories;
    if (isset($categories->first()->products)){
        $products = $categories->first()->products;
    }
}
但是,我的代码只返回第一类的产品。

也许您可以这样做

 $company = Company::findOrFail($id);
 $categories_ids = $company->category->pluck('id');
 $products = Product::whereIn('category_id',$categories_ids')->get();
你也许可以用HassThrouthMany

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...
        );
    }
}
您可以在中阅读更多信息

请试试这个,让我知道它是如何工作的:)

也许你可以这样做

 $company = Company::findOrFail($id);
 $categories_ids = $company->category->pluck('id');
 $products = Product::whereIn('category_id',$categories_ids')->get();
你也许可以用HassThrouthMany

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...
        );
    }
}
您可以在中阅读更多信息


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

这里有两个问题

首先,您需要修改您的关系以避免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
        }
    }
}

这里有两件事不对

首先,您需要修改您的关系以避免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
        }
    }
}

听说过“急装”吗?@Viney不,我不知道这是什么?听说过“急装”吗?@Viney不,我不知道这是什么这是多对多。。。我想。公司有许多门类,而门类有许多产品。不管怎样,你都可以使用第一种解决方案。另外,如果你有一个类别中的产品,但与公司不对应,可能你需要其他关系来连接公司和产品。这是多对多。。。我想。公司有许多门类,而门类有许多产品。任何方法都可以使用第一种解决方案。另外,如果您有一个类别中的产品,但与公司不对应,那么您可能需要其他关系来连接公司和产品。