【问题标题】:Laravel eloquent where max date equal to past 30 daysLaravel 雄辩,其中最大日期等于过去 30 天
【发布时间】:2016-07-26 12:16:57
【问题描述】:

我有这口才:

$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

我目前的解决方案:

迭代每个用户并检查他们的最大值created_at

谢谢

【问题讨论】:

  • 您要准确查询的是什么,看起来有更雄辩的方法可以做到这一点?您正在查询 user_id 在您的数组中的位置,但是您要对日期做什么?
  • 嗨@詹姆斯。抱歉我的解释不好。我试图查询最后一笔交易等于 1 个月的用户数组中的所有交易
  • 当你说等于 1 个月时,你想要那些 created_at 日期正好是过去一个月的那些还是 1 个月或更早的那些?
  • @James 正好一个月。
  • 你能提供表结构吗?简化...

标签: php laravel


【解决方案1】:

您可以简单地执行此操作,而无需使用 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;

【讨论】:

  • 我试过这种方式,但问题是如果用户有 2 笔交易,它将继续显示 1 个月的交易。我想从用户那里获得最后一笔交易。如果最后一个是 != 1 个月,则不显示交易。
  • @SSuhat 所以你只关注每个用户一个月前的最新交易?
  • 正确。甚至用户也有 100 笔交易。我只想拿最新的。
  • 您必须使用whereIn,还是可以为每个用户运行单独的查询并将它们作为一个批量集返回?
  • @Kyslik 限制结果将对所有用户进行限制,并且只返回一个结果,而不是为每个用户返回一个结果。
【解决方案2】:

现在我尝试的是按降序对表格进行排序,以评估最新记录何时按用户 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;

【讨论】:

  • 这应该可以工作。但我忘了告诉我,我的交易 ID 不是递增的。所以使用 MAX(id) 不会得到最新的 id
【解决方案3】:

无需进行原始查询。

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

return $transactions;

【讨论】:

  • 我试过这种方式,但问题是如果用户有 2 笔交易,它将继续显示 1 个月的交易。我想从用户那里得到最新的交易。如果最后一个是 != 1 个月,则不显示交易。
  • 你试过->whereDate('created_at', '<=', Carbon::today()->subDays(30)->toDateString())
  • 我已经尝试过你的方法,但我仍然可以超过 30 天(重复结果)。
【解决方案4】:

你必须使用 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;

【讨论】:

  • 没有 OP 没有,OP 可以使用简单的whereDate('created_at', Carbon::now()->subMonth()->format('Y-m-d')),他试图解决的问题是重复,OP 只希望每个用户有一条记录。
猜你喜欢
  • 2017-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多