【问题标题】:Laravel where has on last recordLaravel 在哪里有上一次记录
【发布时间】:2020-05-26 17:08:05
【问题描述】:

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

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,则模型应为 返回。
  • 如果 a 语句的最新历史值具有 read_flag = true a 即使有较旧的历史,也不应返回模型 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",
}

【问题讨论】:

  • $end 是我使用的一个变量,因此我可以查看较早时期的选择记录。使用此查询时,我正在传递 '2020-02-09 23:59:59'
  • 您能否更新答案并将您的实际输入和输出写入预期结果,或者您也可以尝试使用whereDate() 而不是where()
  • whereDate() 似乎没有影响
  • 这里的问题-&gt;latest()-&gt;limit(1)-&gt;where('read_flag', '=', 0) 你认为你正在获取最后一条记录然后检查它的标志,但事实并非如此,查询首先匹配 where 条件然后尝试获取最后一条记录。

标签: laravel laravel-6.2


【解决方案1】:

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);
});

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

【讨论】:

  • 为了提高效率,您可以使用 with 函数在 eloquent 查询中加载最后一个历史元素,使其成为单个数据库查询,而不是对每个语句记录的额外查询(当在拒绝函数)。
猜你喜欢
  • 2018-03-29
  • 1970-01-01
  • 1970-01-01
  • 2018-03-27
  • 2010-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多