9

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

$post = Post::where('slug', '=', $slug)->where('YEAR(created_at)', '=', $year)->first();

我得到的异常如下 - 消息:

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,
)

因此,基本上,它将YEAR()MySQL 函数封装为列。有没有办法在不使用原始查询的情况下做到这一点?

4

4 回答 4

33

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

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

你会得到查询:

SELECT * FROM `posts` WHERE `slug` = ? AND YEAR(created_at) = ? LIMIT 1
于 2013-06-13T12:36:06.510 回答
5

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

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

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

于 2013-01-10T20:09:44.050 回答
4

你有两种方法可以做到这一点,这取决于你的 laravel 版本

首先使用Raw方法传递函数,如下例所示

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

ِ您也可以在 (select,group,order) 方法中使用它,有关 Raw Laravel Docs的更多信息,它从 v 4.2 开始

第二次使用whereYear方法

$post = Post::where('slug', $slug)
      ->whereYear('created_at', $year)
      ->first();

此方法从 V 5.3 开始以获取更多信息阅读 Where 部分 ,您将找到所有日期方法(whereDate / whereMonth / whereDay / whereYear)

于 2017-09-05T16:40:24.003 回答
1

我使用 Laravel 5.3

$post = Post::where('slug', '=', $slug)->whereYear('created_at', '=', $year)->first();

这家伙帮了我>> https://stackoverflow.com/a/32843415/7752468

于 2017-06-03T03:13:56.923 回答