外键过滤的精妙方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了外键过滤的精妙方法相关的知识,希望对你有一定的参考价值。

我有一个产品模型,其中有许多SalePrices(随着时间的推移而变化),存储在两个数据库表中,通过一个外键和eloquent关系连接。

<?php

namespace App;

use IlluminateDatabaseEloquentModel;

class Product extends Model
{

  public function sale_prices()
  {
      return $this->hasMany('AppSalePrices');
  }
}

我想做的是,根据一个传入的Http请求查询来过滤产品,所以我在控制器中得到了产品列表。

$products = Product::whereIn('type', $request->types)->where('active', 1);

然后,我检查一个最低价格或最高价格, 并尝试相应的过滤。

if ($request->has('min_price')) {
    $products->sale_prices()->where('price', '>=', $request->min_price);
}

if ($request->has('max_price')) {
    $products->sale_prices()->where('price', '<=', $request->max_price);
}

 $products = $products->get();

但这是行不通的,并给了我这个错误。

Call to undefined method IlluminateDatabaseEloquentBuilder::sale_prices()

我知道$products变量现在是一个项目的集合 但我不知道如何在这些项目上应用我的过滤器 我可以对它们进行循环,但我如何应用我正在寻找的where子句?

答案

sale_prices() 是Model对象的一个方法,你不能通过Eloquent构建器调用它。

使用 "模型对象 "的方法,你不能通过Eloquent构建器调用它。哪里有 来检查哪个产品与min_price或max_price有关系。

$products = Product::whereIn('type', $request->types)->where('active', 1);

if ($request->has('min_price')) {
    $products->whereHas('sale_prices', function($query) use ($min_price) {
        $query->where('price', '>=', $min_price);
    });
}

if ($request->has('max_price')) {
    $products->whereHas('sale_prices', function($query) use ($max_price) {
        $query->where('price', '<=', $max_price);
    });
}
$products->whereIn('type', $request->types)->where('active', 1)->get();

另一答案

试着通过products中的get方法。

$products = Product::whereIn('type', $request->types)->where('active', 1)->get();    

以上是关于外键过滤的精妙方法的主要内容,如果未能解决你的问题,请参考以下文章

为什么我不能在此片段中生成唯一对象数组?

django queryset过滤外键

外键的过滤查询集[关闭]

Django 管理员过滤外键组合框

从列或到外键的Laravel过滤器

过滤作为 ViewPager 片段一部分的 ListView