将MySQL函数传递给Eloquent ORM查询

时间:2013-01-10 20:02:57

标签: php database laravel eloquent

我试图在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 个答案:

答案 0 :(得分:25)

为防止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

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:2)

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

首先使用原始方法传递函数,如下例

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

您也可以在(选择,分组,排序)方法中使用它,有关Raw Laravel Docs从v 4.2开始的更多信息

第二次使用 whereYear 方法

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

此方法从V 5.3开始获取更多信息Read Where section您将找到所有日期方法(whereDate / whereMonth / whereDay / whereYear)

答案 3 :(得分:1)

我使用Laravel 5.3

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

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