如何使用子查询做范围

时间:2015-05-26 15:52:47

标签: laravel eloquent laravel-5

我有一个模型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');
           });
}

2 个答案:

答案 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);
    });
}