2016-04-06 5 views
2

У меня есть этот красноречивый:Laravel красноречиво, где максимальная дата равна за последние 30 дней

$users = [1,2,3,4,5]; 
$transactions = Transaction::whereIn('user_id', $users) 
      ->where(DB::raw('DATE(MAX(created_at))'), Carbon::now()->subMonth()->format('Y-m-d'))->get(); 

return $transactions; 

Но вернуть мне эту ошибку: General error: 1111 Invalid use of group function (SQL: select * from transactions where 0 = 1

Как я могу получить все пользователи, последняя сделка равна прошлом 30 дней?

Вот исходный запрос упаковывают вам необходимо:

select * from `transactions` where `0` = 1 and DATE(MAX(created_at)) = ? 

Структура таблицы:

Users Table: id (not autoincrement), name, gender, created_at

Transactions Table: id (not autoincrement), user_id (FK), amount, created_at

Мое текущее решение:

Iterate каждый пользователь и проверка их макс. created_at.

Благодаря

+0

Что это такое, что вы пытаетесь запросить точно, похоже, есть гораздо более красноречивый способ сделать это? Вы запрашиваете, где 'user_id' находится в вашем массиве, но что вы пытаетесь сделать с датой? – James

+0

Привет @James. Извините за мое плохое объяснение. Я попытался запросить все транзакции в пределах этого массива пользователей, что последняя транзакция равна 1 месяцу – ssuhat

+0

Когда вы говорите, что это равно 1 месяц, вы хотите, чтобы те, где дата 'created_at' составляет ровно один месяц в прошлом или те, которые составляют 1 месяц или старше? – James

ответ

0

Вы можете просто сделать это без необходимости использовать DB::raw() запрос.

Попробуйте это:

$users = [1,2,3,4,5]; 
$transactions = Transaction::whereIn('user_id', $users) 
      ->where('created_at', '=', Carbon::now()->format('Y-m-d')) 
      ->get(); 

return $transactions; 
+0

Я пробовал этот путь, но проблема в том, что если у пользователя две транзакции, он будет показывать транзакцию с равным 1 месяцем. Я хочу получить последнюю транзакцию от пользователя. Если последний равен! = 1 месяц, не показывать транзакцию. – ssuhat

+0

@SSuhat, так что вы только после последней транзакции от каждого из тех пользователей, которым месяц? – James

+0

правильный. Даже у пользователя есть 100 транзакций. Я только хочу взять последнее. – ssuhat

0

Теперь то, что я пытался, что я отсортировали таблицу в порядке убывания, чтобы оценить последнюю запись, когда это будет группа по Id пользователя ...

$users = [1,2,3,4,5]; 
$transactions = Transaction::select(DB::raw('select id from transactions order by transaction.created_at desc as table1')->leftJoin('transactions','id','=','table1.id')->whereIn('user_id', $users) 
      ->where('created_at', '=', Carbon::now()->subMonth()->format('Y-m-d'))->groupBy('transaction.user_id') 
      ->get(); 

return $transactions; 
+0

Это должно работать. Но я забываю сказать, что мой идентификатор транзакции не увеличивается. поэтому использование MAX (id) не получит последний идентификатор – ssuhat

0

Нет необходимости делать необработанный запрос.

$users = [1,2,3,4,5]; 
$transactions = Transaction::whereIn('user_id', $users) 
       ->whereDate('created_at', '=', Carbon::today()->subDays(30)->toDateString())->get(); 

return $transactions; 
+0

Я пробовал этот путь, но проблема в том, что если у пользователя есть 2 транзакции, он будет показывать транзакцию с равным 1 месяцем. Я хочу получить последнюю транзакцию от пользователя. Если последний равен! = 1 месяц, не показывать транзакцию. – ssuhat

+0

Вы пробовали '-> whereDate ('created_at', '<=', Carbon :: today() -> subDays (30) -> toDateString())' –

+0

Я пробовал свой путь, но я все могу чем 30 дней (дублирующий результат). – ssuhat

0

вы должны использовать whereBetween

$users = [1,2,3,4,5]; 
$transactions = Transaction::select(DB::raw('DATE(MAX(created_at))'))->whereIn('user_id', $users) 
     ->whereBetween('created_at',array(Carbon::now(),Carbon::now()->subMonth()->format('Y-m-d')))->get(); 

return $transactions; 
+0

no OP не работает, OP может использовать простой 'whereDate ('created_at', Carbon :: now() -> subMonth() -> format ('Ym-d'))', проблема, которую он пытается решить, с дубликатами , OP хочет только одну запись для каждого пользователя. – Kyslik

Смежные вопросы