首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用子查询执行作用域

如何使用子查询执行作用域
EN

Stack Overflow用户
提问于 2015-05-26 15:52:47
回答 2查看 2.3K关注 0票数 4

我有一个模型Partner_deal,它有很多字段,但是您真正需要知道的唯一一个是quantity,它是一个整数,它指定交易可以赎回多少次。

然后,我有另一个模型Partner_deal_redemption,以跟踪赎回。它有一个partner_deal_id列和一个user_id列来记录哪些用户已经赎回了哪笔交易。

我想在我的Partner_deal模型中创建一个范围,以便它只返回赎回次数小于数量字段的交易。

我知道如何在MySql中执行子查询来计算每笔交易的赎回次数,并使用where子句筛选出赎回次数=数量的子查询。

我不知道从何说起雄辩,这是我最好的尝试:

代码语言:javascript
复制
function scopeNotRunOut($query)
{
    return $query->having('quantity', '>', function($q)
           {
               $q->from('partner_deal_redemptions')
                 ->selectRaw('count(*)')
                 ->where('partner_deal_id', '=', 'id');
           });
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-26 16:19:17

您可能可以使用雄辩的has()函数:

http://laravel.com/docs/5.0/eloquent#querying-relations

代码语言:javascript
复制
function scopeNotRunOut($query)
{
    return $query->has('redemptions', '<', DB::raw('quantity'));
}

要使用这个函数,您需要在您的redemptions模型中定义Partner_deal函数,它将表示Partner_deal和Partner_deal_redemption模型之间的关系。

票数 1
EN

Stack Overflow用户

发布于 2015-05-27 08:36:11

MrShibby是正确的,但后来我意识到我需要检查quantity是否为null,所以我将他的解决方案稍微修改了如下:

代码语言:javascript
复制
function scopeNotRunOut($query)
{
    return $query->where(function($q) {
        $q->orHas('redemptions', '<', DB::raw('quantity'))
          ->orWhere('quantity', '=', null);
    });
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30463339

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档