我有一个模型Partner_deal,它有很多字段但是你真正需要知道的唯一一个叫做数量,它是一个整数,指定交易可兑换的次数。
然后我有另一个模型Partner_deal_redemption来跟踪兑换。这有一个partner_deal_id列和一个user_id列,用于记录哪些用户已兑换哪笔交易。
我想在我的Partner_deal模型中创建一个范围,以便它只返回赎回次数小于数量字段的交易。
我知道如何在MySql中执行此操作,方法是执行子查询,计算每笔交易的兑换次数,并使用HAVING子句过滤掉兑换次数=数量的子句。
我不知道从哪里开始这么做,这是我最好的尝试:
function scopeNotRunOut($query)
{
return $query->having('quantity', '>', function($q)
{
$q->from('partner_deal_redemptions')
->selectRaw('count(*)')
->where('partner_deal_id', '=', 'id');
});
}
答案 0 :(得分:1)
您可以使用Eloquent的has()函数:
http://laravel.com/docs/5.0/eloquent#querying-relations
function scopeNotRunOut($query)
{
return $query->has('redemptions', '<', DB::raw('quantity'));
}
要使用此功能,您需要在Partner_deal模型中定义redemptions
功能,该功能将代表Partner_deal与Partner_deal_redemption模型之间的关系。
答案 1 :(得分:0)
MrShibby是正确的,但后来我意识到我需要检查数量是否为空,所以我稍微修改了他的解决方案:
function scopeNotRunOut($query)
{
return $query->where(function($q) {
$q->orHas('redemptions', '<', DB::raw('quantity'))
->orWhere('quantity', '=', null);
});
}