基于父列的查询关系

时间:2019-01-05 02:07:48

标签: php laravel

我有2张桌子

accounts  : id , title , disabled , transaction_amount_limit , transaction_count_limit 

account_limits : id , account_id , transaction_amount , transaction_count , date 

因此每个帐户每天都有一堆交易...我想选择一个尚未达到交易限额的帐户....每个帐户的当前交易都存储在account_limits表中

基本上我想说的是选择没有account_limits行或没有account_limits但没有达到限制account_limits.transaction_amount < accounts.transaction_amount_limit && account_limits.transaction_count < accounts.transaction_count_limit

的帐户

类似

select * from `accounts`

(  where not exists (select * from `account_limits` where `accounts`.`id` = `account_limits`.`account_id`)
OR 
where exists (select * from `account_limits` where `accounts`.`id` = `account_limits`.`account_id` &&  account_limits.transaction_amount < accounts.transaction_amount_limit  && account_limits.transaction_count < accounts.transaction_count_limit)
)

我到目前为止有

    $account = Account::where('disabled' , 0 )->where(function($q){
        $q->whereDoesntHave('AccountLimit')->orWhere('....') ;
    })->get();

@Flame建议我尝试过

Account::whereHas('accountLimits', function($query) {
    $query->where('account_limits.transaction_amount', '<', 'accounts.transaction_amount_limit')
    ->where('account_limits.transaction_count', '<', 'accounts.transaction_count_limit');
})->orHas('accountLimits', '=', 0);

问题是由于某种原因

where('account_limits.transaction_amount', '<', 'accounts.transaction_amount_limit')
输出中的

将转换为

where `account_limits`.`transaction_amount`  < 'accounts.transaction_amount_limit'

查询失败,报价出现问题

    this 

 'accounts.transaction_amount_limit' 

should be

 `accounts`.`transaction_amount_limit`

3 个答案:

答案 0 :(得分:0)

作为直接的MySQL查询,应该可以执行以下操作:

SELECT a.* 
FROM accounts a
JOIN limits l ON l.transaction_amount < a.transaction_amount_limit AND 
                 l.transaction_count  < a.transaction_count_limit

JOIN条件将过滤出所有达到或超过其transaction_amounttransaction_count限制的帐户。

答案 1 :(得分:0)

这是Eloquent语法的示例答案。请注意,您需要添加关系:

// Account.php , your eloquent model
public function accountLimits()
{
    return $this->hasMany(AccountLimit::class);
}

对于查询:

Account::whereHas('accountLimits', function($query) {
    $query->where('account_limits.transaction_amount', '<', 'accounts.transaction_amount_limit')
    ->where('account_limits.transaction_count', '<', 'accounts.transaction_count_limit');
})->orHas('accountLimits', '=', 0);

这将使用whereHas检查关系中的子句,如果不匹配,还将在orHas中添加匹配的记录,从而找到所有没有accountLimits的帐户关系。

答案 2 :(得分:0)

对我来说,最好将transaction_count和transaction_limit保留在同一表(帐户)中。 然后,您可以比较这些列。

$ accounts = Account :: whereRaw(“ transaction_count get();