外键过滤的精妙方法
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();
以上是关于外键过滤的精妙方法的主要内容,如果未能解决你的问题,请参考以下文章