试图从 laravel 中的日期获取月份(并且 postgres 提取不起作用)

Posted

技术标签:

【中文标题】试图从 laravel 中的日期获取月份(并且 postgres 提取不起作用)【英文标题】:Trying to get month from date in laravel (and postgres extract not working) 【发布时间】:2015-11-05 12:04:47 【问题描述】:

我正在使用 postgres 制作我的第一个 laravel 项目,我希望能够访问本月所有生日的人(我的人员表有一个生日字段,即日期)。我可以使用 extract 从数据库中获取这些记录,如下所示:

select * from people 
   where extract (month from birthdate) = 11;

但是当我在控制器中尝试几种不同的方法时,我会收到“未知列”错误:

$birthday_people = DB::table('people')
    ->where ("extract(month from birthdate)", "=", "11")
    ->get();

(我最终会调整它以与 Carbon::now()->month 进行比较,并使用模型 Person::all(),但直到我会得到一些结果,我会尽可能简单)

有没有一种特殊的方法可以从 laravel 中的日期获取月份?

更新:我现在在我的 Person 模型中使用范围。当我给它一个确切的日期时,我可以得到人的结果:

public function scopeBirthdays($query)

    return $query->where('birthdate', '=', '1947-11-02');

如果我这样做,我可以在一个月内获得结果,但问题是它似乎不再知道它是 People 的集合(我无法访问人员列当我显示它并且我无法链接其他范围时):

public function scopeBirthdays($query)

    return $query->whereRaw('extract(month from birthdate) = ?', ['11'])->get();

Laravel 的查询构建器提供 'whereMonth'-(似乎是最正确的),但它给了我一个“未定义的函数”错误,直到我把 bool 放在最后,现在当前的错误提示它解释的是几个月而不是哪个(?):

public function scopeBirthdays($query)

   return $query->whereMonth('birthdate', '=', Carbon::today()->month, true);

我得到: 语法错误:7 错误:“月”或附近的语法错误 LINE 1: select * from "people" where 1 month("birthdate") = $1 ^ (SQL: select * from "people" where 1 month("birthdate") = 11)

最终更新:通过在我的范围内使用 whereRaw,我能够返回结果(被正确解释为人):

public function scopeBirthdays($query)

    return $query->whereRaw('extract(month from birthdate) = ?', [Carbon::today()->month])->orderBy ('birthdate', 'asc');

谢谢大家!

【问题讨论】:

【参考方案1】:

根据上一个问题尝试:

$birthday_people = DB::table('people')
    ->whereRaw("extract(month from birthdate)", "=", "11")
    ->get();

你可以设置为关系

public function custom()
   return $this->hasMany('App\Models\People')->whereRaw("extract(month from birthdate)", "=", "11");

【讨论】:

谢谢你——这确实让我得到了结果!缺点是它们没有被解释为“人”的结果(我不能使用范围、字段和东西)-更新了上面的描述以及发生了什么 哦,看起来很有希望——今晚我回家后试试!谢谢你:) 再次感谢您的帮助- whereRaw 让我从模型中的范围中获取结果,如下所示: public function scopeBirthdays($query) return $query->whereRaw('extract(month from生日) = ?', [Carbon::today()->month])->orderBy ('birthdate', 'asc'); 【参考方案2】:

你可以试试这样的。它将作为 App\People 的实例返回,因此您仍然可以使用您的 eloquent 函数。

public function scopeBirthdays($query)

    return $query->where('birthdate', 'LIKE', Carbon::today()->year . '-'.Carbon::today()->month.'%');

我对 Carbon 没有太多经验,我假设 Carbon::today() 将返回一个带有年、月和日期的对象。

【讨论】:

感谢您的建议!它不喜欢 'like' 并给了我一个未定义的函数,但幸运的是我能够通过上面的 'whereRaw' 建议到达那里。非常感谢***宇宙:)

以上是关于试图从 laravel 中的日期获取月份(并且 postgres 提取不起作用)的主要内容,如果未能解决你的问题,请参考以下文章

从jooq中的日期获取月份名称

从 Oracle 中的日期获取月份名称

Informix - 从日期中提取月份中的某一天,并且只选择奇数天

如何从 SQL Server 中的日期获取月份编号(不是月份名称)?

Laravel 仅按日期分组并获取计数

如何从 Presto 中的日期获取月份名称