将MySQL函数传递给Eloquent ORM查询

Nig*_*ICU 8 php database laravel eloquent

我试图在Eloquent ORM中执行以下查询,似乎无法执行MySQL函数 -

$post = Post::where('slug', '=', $slug)->where('YEAR(created_at)', '=', $year)->first();
Run Code Online (Sandbox Code Playgroud)

我得到的例外情况如下 - 消息:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'YEAR(created_at)' in 'where clause'

SQL: SELECT * FROM `posts` WHERE `slug` = ? AND `YEAR(created_at)` = ? LIMIT 1

Bindings: array (
  0 => 'placeholder',
  1 => 2013,
)
Run Code Online (Sandbox Code Playgroud)

所以,基本上,它将YEAR()MySQL函数封装为一列.有没有办法在不使用原始查询的情况下执行此操作?

ULa*_*ins 25

为了防止Eloquent ORM用撇号包装第一个变量,你可以使用如下DB:raw函数:

$post = Post::where('slug', '=', $slug)
        ->where(DB::raw('YEAR(created_at)'), '=', $year)
        ->first();
Run Code Online (Sandbox Code Playgroud)

你会得到查询:

SELECT * FROM `posts` WHERE `slug` = ? AND YEAR(created_at) = ? LIMIT 1
Run Code Online (Sandbox Code Playgroud)

  • 这篇 3 年前的帖子今天挽救了我的生命。非常感谢好先生:-) (2认同)
  • @ImmAssidiqqi ULazdins 的这篇文章也救了我 - 而且现在是 2023 年。 (2认同)

Mik*_*ant 5

您可能不想YEAR()在WHERE子句中使用该函数.这会阻止您在created_at列上使用任何索引.我建议你LIKE改用:

$post = Post::where('slug', '=', $slug)->where('created_at', 'LIKE', $year . '%')->first();
Run Code Online (Sandbox Code Playgroud)

query()如果您需要在查询中使用不受支持的MySQL函数,也可以使用原始SQL查询(使用方法).