我有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`
答案 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_amount
或transaction_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