我试图在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函数封装为一列。有没有办法在不使用原始查询的情况下执行此操作?
答案 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