如何在 eloquent 上使用 WHERE 来比较 table 中按年和月列创建的日期 Laravel?
How to use a WHERE on eloquent for comparing a date created by year and month column in a table for Laravel?
public function scopeStartsFrom(Builder $query, $month, $year): Builder
{
return $query->addSelect(DB::raw("str_to_date(concat(year,'-',month,'-',1), '%Y-%m-%d') as carbon"))->where('carbon', '>=', Carbon::createFromDate($year, $month, 1));
}
我有一个 table 具有单独的年和月列。如何做到这一点,以便我可以将 year/month 列用于我可以用于我的范围的日期。那么,如果我输入 2000 年和 10 月,它会输出从该年和该月开始的所有行吗?谢谢!我正在使用 Laravel 8、Spatie 查询生成器和 MySQL.
年 |月
2009 | 12
2013 | 1个
2011 | 5个
2010 | 10
所以如果我输入 2010 年和 11 月,它只会输出第二行和第三行。
我觉得计算量太大了。
当你给出年份和月份时,只能进行两次比较。
- 如果年份大于给定,则日期肯定大于给定日期
- 如果年份相同但月份大于或等于。
所以我认为正确的查询应该是:
public function scopeStartsFrom(Builder $query, $month, $year): Builder
{
return $query->addSelect(
DB::raw("str_to_date(concat(year,'-',month,'-',1), '%Y-%m-%d') as carbon")
)->where(function($q) use ($year, $month) {
$q->where('year', '>', $year)
->orWhere([
['year', '>=', $year],
['month', '>=', $month]
]);
});
// Generated query:
SELECT * FROM table WHERE (year > 2022 OR (year >= 2022 AND month >= 4))
}
public function scopeStartsFrom(Builder $query, $month, $year): Builder
{
return $query->addSelect(DB::raw("str_to_date(concat(year,'-',month,'-',1), '%Y-%m-%d') as carbon"))->where('carbon', '>=', Carbon::createFromDate($year, $month, 1));
}
我有一个 table 具有单独的年和月列。如何做到这一点,以便我可以将 year/month 列用于我可以用于我的范围的日期。那么,如果我输入 2000 年和 10 月,它会输出从该年和该月开始的所有行吗?谢谢!我正在使用 Laravel 8、Spatie 查询生成器和 MySQL.
年 |月 2009 | 12 2013 | 1个 2011 | 5个 2010 | 10
所以如果我输入 2010 年和 11 月,它只会输出第二行和第三行。
我觉得计算量太大了。 当你给出年份和月份时,只能进行两次比较。
- 如果年份大于给定,则日期肯定大于给定日期
- 如果年份相同但月份大于或等于。
所以我认为正确的查询应该是:
public function scopeStartsFrom(Builder $query, $month, $year): Builder
{
return $query->addSelect(
DB::raw("str_to_date(concat(year,'-',month,'-',1), '%Y-%m-%d') as carbon")
)->where(function($q) use ($year, $month) {
$q->where('year', '>', $year)
->orWhere([
['year', '>=', $year],
['month', '>=', $month]
]);
});
// Generated query:
SELECT * FROM table WHERE (year > 2022 OR (year >= 2022 AND month >= 4))
}