首页 > 解决方案 > Laravel 在哪里有上一次记录

问题描述

这是我正在尝试执行的当前查询

Statement::whereHas('history',  function ( $query) use ($end) {
                $query->where('created_at', '<', Carbon::parse($end))->latest()->limit(1)->where('read_flag', '=', 0);
            });
        })->get()

我正在尝试获取一些最新历史值具有read_flag = false.

目前,read_flag = false当我只想查询最新记录时,我正在执行的查询仍然返回旧值。有什么方法可以做到这一点?

$end我使用的价值是2020-02-09 23:59:59

使用查询时,我必须记录设置。

该记录是较新的记录read_flag = true

"id":77,
"statement_id":4,
"statement_version_id":4,
"read_count":1,
"unread_count":0,
"read_flag":1,
"created_at":"2020-02-09 12:16:23",
"updated_at":"2020-02-10 12:16:23"
}

该记录是较旧的记录read_flag = false

"id":65,
"statement_id":4,
"statement_version_id":4,
"read_count":0,
"unread_count":2,
"read_flag":0,
"created_at":"2020-02-07 13:25:06",
"updated_at":"2020-02-07 13:25:06"
}

因此,在运行查询时,我希望不会返回任何语句,因为最新记录已read_flag = true

然而这是我得到的输出

{
"id":4,
"site_id":9786,
"team_id":9421,
"name":"ds",
"company_statement_id":1,
"current_statement_version_id":4,
"system_company_statement_id":null,
"created_at":"2020-02-03 10:17:13",
"updated_at":"2020-02-03 10:17:13",
}

标签: laravellaravel-6.2

解决方案


AFAIK 没有内置的 eloquent 函数可以给你这种行为。

但是,您可以在检索后过滤您的集合并拒绝与您的条件不匹配的元素,如下所示(代码未经测试):

$statements = Statement::whereHas('history', function ($query) use ($end) {
    $query->where([
        ['created_at', '<', Carbon::parse($end)],
        ['red_flag', 0]
    ]);
})
->get()
->reject(function($element) use($end) {
    $latestHistory = $element->history()->latest()->first();
    return (Caron::parse($latestHistory->created_at)->gte(Carbon::parse($end)) || $latestHistory->red_flag !== 0);
});

编辑:修正了一些代码错别字。


推荐阅读