Laravel 最后一条记录
Laravel where has on last record
这是我正在尝试执行的当前查询
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
模型应该是
返回。
- 如果一个语句最新的历史值有一个
read_flag = true
一个
即使有较早的历史记录,也不应返回模型
read_flag = false
.
目前,当我只想查询最新记录时,我正在做的查询仍然是 returns 带有 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",
}
据我所知,没有内置的 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);
});
编辑:修正了一些代码拼写错误。
这是我正在尝试执行的当前查询
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
模型应该是 返回。 - 如果一个语句最新的历史值有一个
read_flag = true
一个 即使有较早的历史记录,也不应返回模型read_flag = false
.
目前,当我只想查询最新记录时,我正在做的查询仍然是 returns 带有 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",
}
据我所知,没有内置的 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);
});
编辑:修正了一些代码拼写错误。