У меня есть 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`
1
hretic 5 Янв 2019 в 05:07

2 ответа

Как прямой запрос 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 ограничения.

0
Nick 5 Янв 2019 в 02:57

Для меня будет хорошей идеей хранить транзакции в одной и той же таблице (счета). Тогда вы можете сравнить эти столбцы.

$ accounts = Account :: whereRaw ("транзакция_счет <транзакция_лимит) -> get ();

0
Maga Serdarov 8 Янв 2019 в 14:51