【问题标题】:Combine laravel queries结合 laravel 查询
【发布时间】:2021-05-27 16:30:21
【问题描述】:

是否可以将这些查询合并为一个?我需要的是从现在开始以 6 小时间隔获得 4 行。

$data1 = TransacoesRecentes::orderBy('created_at', 'desc')
        ->whereRaw('created_at <= NOW() - INTERVAL 24 HOUR')
        ->first();

$data2 = TransacoesRecentes::orderBy('created_at', 'desc')
        ->whereRaw('created_at <= NOW() - INTERVAL 18 HOUR')
        ->first();

$data3 = TransacoesRecentes::orderBy('created_at', 'desc')
        ->whereRaw('created_at <= NOW() - INTERVAL 12 HOUR')
        ->first();

$data4 = TransacoesRecentes::orderBy('created_at', 'desc')
        ->whereRaw('created_at <= NOW() - INTERVAL 6 HOUR')
        ->first();

谢谢。

【问题讨论】:

  • 你能说得更具体些吗?
  • 不知道如何更具体,我发布了 4 个查询,每个查询将返回 1 个结果,我在问是否有可能有 1 个查询返回相同的 4 个结果。跨度>

标签: laravel laravel-5 eloquent


【解决方案1】:

可以使用DB::union()方法连接多个查询。
https://laravel.com/docs/8.x/queries#unions

$data1 = TransacoesRecentes::orderBy('created_at', 'desc')
        ->whereRaw('created_at <= NOW() - INTERVAL 24 HOUR')
        ->limit(1);

$data2 = TransacoesRecentes::orderBy('created_at', 'desc')
        ->whereRaw('created_at <= NOW() - INTERVAL 18 HOUR')
        ->limit(1);

$data3 = TransacoesRecentes::orderBy('created_at', 'desc')
        ->whereRaw('created_at <= NOW() - INTERVAL 12 HOUR')
        ->limit(1);

$data4 = TransacoesRecentes::orderBy('created_at', 'desc')
        ->whereRaw('created_at <= NOW() - INTERVAL 6 HOUR')
        ->limit(1);

$transactions = $data1
    ->union($data2)
    ->union($data3)
    ->union($data4)
    ->get();

虽然我不能说这在实践中是否理想。

【讨论】:

  • 糟糕,无法阅读;我明白你在做什么。
  • 是的,这是我能想到的排除从父查询返回任何结果的最快方法。我不喜欢它,但它很有效。
  • 哈哈是的,它完成了工作!另一种方法是$transactions = TransacoesRecentes::orderBy()-&gt;whereRaw()-&gt;limit()-&gt;union(TransacoesRecentes::orderBy()-&gt;whereRaw()-&gt;union(...)),但我不确定这是好是坏……你的肯定更干净。
  • 啊……很公平。我不知道在这样的条件之后放置union()。学到了新东西,谢谢。
  • 更新了原始答案。这更有意义。谢谢。
【解决方案2】:

您始终可以收集每个查询的输出,或者您可以在模型中创建一个小的静态函数,提取您需要作为参数提供的值间隔,(使用 Carbon 更好)

public static function getItemBeforeInterval ($interval)
{
return TransacoesRecentes::orderBy('created_at', 'desc')
        ->where('created_at', '<=', Carbon::now()->subHours($interval))
        ->first();
}

您可以在控制器中收集数据:

$data = collect(TransacoesRecentes::getItemBeforeInterval(24),TransacoesRecentes::getItemBeforeInterval(18),TransacoesRecentes::getItemBeforeInterval(12),TransacoesRecentes::getItemBeforeInterval(6))

【讨论】:

    猜你喜欢
    • 2019-02-05
    • 2018-08-28
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 2020-08-03
    • 2016-09-28
    • 2023-03-31
    • 1970-01-01
    相关资源
    最近更新 更多