【问题标题】:Select all Filters from Products which belongs to one Category in Laravel从属于 Laravel 中一个类别的产品中选择所有过滤器
【发布时间】:2016-10-16 23:22:59
【问题描述】:

我有这些表:

  • 类别
  • 产品
  • 过滤器
  • Product_filter

类别 -> 线 -> 产品 -> 过滤器

一个产品有多个过滤器

一个产品有一个类别和一个线

我需要获取一个类别的所有过滤器。 今天,通过表之间的关系,我可以得到一个类别的所有产品和一个产品的所有过滤器:

// All the products
$category->products

// All the filters
$product->filters

//or
$category->products->first()->filters

现在,我需要按类别获取过滤器,例如:

$category->filters
// or
$category->products->filters

一个小简介:

  • 某个类别的产品具有过滤器

如何按类别获取所有过滤器?

【问题讨论】:

  • 您需要为此使用 JOINS。刚刚更新了我的答案。试试看。

标签: php laravel model eloquent relationships


【解决方案1】:

在您的Category 模型中:

public function filters()
{
    return Filter

        ::join('filter_product', 'filter.id', '=', 'filter_product.filter_id')

        ->join('products', 'filter_product.product_id', '=', 'products.id')

        ->join('categories', 'products.category_id', '=', 'categories.id')

        ->where('categories.id', $this->id);
}

public function getFiltersAttribute()
{
    if (!$this->relationLoaded('products') || 
        !$this->products->first()->relationLoaded('filters')) {
        $this->load('products.filters');
    }

    return collect($this->products->lists('filters'))->collapse()->unique();
}

那么你就可以这样使用它了:

$category->filters

为了保证唯一的filter 结果,您需要传递唯一的字段,例如。 id

return collect($this->products->lists('filters'))->collapse()->unique('id');

【讨论】:

  • 在你的例子中你有Product_filter,你可能想要更新 JOINS 是正确的。默认情况下,Laravel 会使用 filter_product 表来处理这个关系。
  • 我测试过,似乎可以工作,@crabbly,但我没有得到明显的结果。
  • 这是因为数据透视表数据。即使filter 相同,但数据透视数据不同,因此unique 方法不会对其进行过滤。
  • 只需将您想要的字段传递给unique 方法,这可能是更简单的解决方案。
【解决方案2】:

如果我理解正确,你需要 with 子句:

$category->with(products.filters)->get()

【讨论】:

  • 不完全是,@Everton Mendonça。使用您的代码,我得到了类别。我需要的是按类别筛选。但是现在,我在过滤器和类别之间没有联系。我不知道如何处理这种关系。
猜你喜欢
  • 1970-01-01
  • 2019-06-20
  • 2023-03-18
  • 1970-01-01
  • 2018-04-12
  • 2020-04-28
  • 2015-03-02
  • 1970-01-01
  • 2020-02-13
相关资源
最近更新 更多