【问题标题】:Laravel - Get the most recently created rows for a variety of IDs, from an arrayLaravel - 从数组中获取各种 ID 最近创建的行
【发布时间】:2016-06-27 17:37:56
【问题描述】:

我需要一个 Laravel 查询,它返回最近创建的各种 site_id 行。目前,我有这个查询:

Score::whereIn('site_id', $sites)->where('type', 2)->select('score')->get();

但它会返回网站的所有分数,其中 type = 2。

目前$sites数组只包含1,2,所以会排除3和4的site_id。

数据库结构:

查询返回的预期结果将是以下行:

ID: 1, 2. - 它们是数组中最近创建的 ID 行。

更新:

如果我使用:

Score::whereIn('site_id', $sites)->where('type', 2)
            ->select('score')
            ->groupBy('site_id')
            ->get();

groupBy 方法,它返回我想要的两个分数,但我不确定它为什么会返回它们?我以为它只会按 site_id 对网站的所有分数进行分组?

感谢您的帮助。

【问题讨论】:

    标签: php arrays laravel eloquent laravel-5.2


    【解决方案1】:

    这是您需要的:https://softonsofa.com/tweaking-eloquent-relations-how-to-get-latest-related-model/

    这样你就可以轻松做到这一点:

    $sites = Site::with('latestScore')->find($siteIds); // Collection
    // now for each site:
    $site->latestScore // what you wanted
    

    但是,如果您想要收集分数而不是通过site 访问它们,那么请使用收集方法:

    $sites = Site::with('latestScore')->find($siteIds); // Collection
    $scores = $sites->pluck('latestScore') // get nested elements from collection
                    ->filter() // filter out null items
    

    【讨论】:

    • 感谢您的回复,但是,如果我 dd($sites);,我会返回 NULL。在我的Site 模型中,我有以下内容:public function latestScore() { return $this->hasOne('App\Score')->latest(); }。但是,如果我执行 `dd($siteIds),它会返回 1 和 2(正确的)。
    • 使用find([1,2])会返回一个集合,所以如果你有这样的行,那么它肯定会返回它们。
    • 啊,你打败了我 ;) 我手动输入 ->find('1') 并且有效。我目前正在使用Site::where('trust_id', $trust_id)->select('id')->get(); 来获取 ID。我不确定为什么那行不通?如果我dd($siteIds),它确实会在集合中显示 1 和 2。
    • 因为传递集合 (get) 不会像您预期的那样工作。使用Site::where(..)->pluck('id')->all() 获取一个数组,稍后您可以将其传递给find()然而在这种情况下你根本不需要那个。只需运行 Site::where(..)->with('latestScore')->get() 即可。
    • 完美运行。贾雷克,非常感谢。你又挽救了一天!
    【解决方案2】:

    在我看来,您只需要一个 orderBy("created_at") 链接到您雄辩的查询的末尾。

    【讨论】:

    • 感谢您的回复,但 orderBy 仍会返回与数组中那些 site_id 相关的所有结果,它们只是以某种方式排序。我不想要所有结果,我只想要最近创建的结果。
    • 好的,那么“最近创建”的截止值是多少? 1小时? 1天?您可以使用 Carbon 轻松处理 eloquent 查询中的日期。希望这会有所帮助。
    • 没有截断,只是为每个 site_id 创建的最新一个!如果该站点有 10 行,请选择最近添加的行。如果数组中的另一个站点有 3 行,请选择最近添加的站点。
    • 看看可用的收集方法,特别是唯一的和过滤器。他们可能会实现你所追求的。 laravel.com/docs/master/collections
    • @Ben 定义最近的?
    猜你喜欢
    • 2021-10-01
    • 1970-01-01
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    • 2012-01-24
    相关资源
    最近更新 更多