laravel 雄辩,只检查单对多关系中的第一项
Posted
技术标签:
【中文标题】laravel 雄辩,只检查单对多关系中的第一项【英文标题】:laravel eloquent, check only first item in onetomany relationship 【发布时间】:2022-01-07 21:56:38 【问题描述】:我有 2 个模型:
有多种价格的产品型号:
public function prices()
return $this->hasMany(Price::class)->orderBy('price', 'DESC');
属于产品的价格模型:
public function product()
return $this->belongsTo(Product::class);
还有一些其他的关系。我有一个这样的查询:
$query = Product::query();
$query->where('brandId', $brand->id);
$query->where('termId', $termId);
$query->when($productType, function ($q) use ($productType)
$q->with('productAttributes')->whereHas('productAttributes', function($query) use ($productType)
$query->where(['attributeId'=> 5, 'attributeDataId'=>$productType]);
);
);
我也想查询商品价格。
主要问题是我只想检查第一个价格以查看它是否小于给定数字。
此查询检查所有价格(这不是我想要的):
$query->when($maxPrice, function ($q) use ($maxPrice)
$q->with('prices')->whereHas('prices', function($query) use ($maxPrice)
$query->where('price', '<=', $maxPrice);
);
);
【问题讨论】:
与产品的第一个价格一样?这会使用id
/created_at
日期来确定哪个是“第一”吗?另外,你使用的是什么版本的 Laravel?
是的,产品的第一个价格。我正在使用 Laravel 7。我已经按 price
列(相关)对价格进行了排序。
【参考方案1】:
您可以为此使用subquery where clause:
->where(function ($query)
$query->select('price')
->from('prices')
->whereColumn('products.id', 'prices.product_id')
->orderByDesc('price')
->limit(1);
, '<=', $maxPrice)
您的查询将类似于:
$query = Product::query()
->where('brandId', $brand->id)
->where('termId', $termId)
->when($productType, function ($q) use ($productType)
$q->with('productAttributes')
->whereHas('productAttributes', function ($query) use ($productType)
$query->where(['attributeId' => 5, 'attributeDataId' => $productType]);
);
)
->when($maxPrice, function ($q) use ($maxPrice)
$q->with('prices')->where(function ($query)
$query->select('price')
->from('prices')
->whereColumn('products.id', 'prices.product_id')
->orderByDesc('price')
->limit(1);
, '<=', $maxPrice);
);
【讨论】:
以上是关于laravel 雄辩,只检查单对多关系中的第一项的主要内容,如果未能解决你的问题,请参考以下文章