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 に答える