Kohana 3 ormの選択クエリでデータベース関数の使用方法
-
02-10-2019 - |
質問
Kohana 3のORMモジュールを使用してPostgresを使用しています。Postgres関数を使用してSELECTを実行して、比較を行う前にデータベース内の値を小文字に変換したいと考えています。
SQLで私は書きます:
select * from accounts where lower(email) = 'alice@spam.com';
コハナでは、このようなものを書きたいと思います。
$user = ORM::factory('user')
->where('lower(email)', '=', strtolower('alice@spam.com'))
->find();
しかし、ORMは列名を「電子メール」ではなく「低い(電子メール)」と推定しようとしているため、これはエラーを与えます。
私はKohanaとOrmを初めて使用しているので、同じ結果を与える代替品も役立ちます。
解決
または私見でさえも、これを試してみてください:
$user = ORM::factory('user')
->where('LOWER("email")', '=', DB::expr("LOWER('alice@spam.com')"))
->find();
詩db :: lower()ヘルパーを作成する必要はありませんが、それは私だけかもしれません...
編集:
$value = 'alice@spam.com';
$user = ORM::factory('user')
->where('LOWER("email")', '= LOWER', (array) $value)
->find();
クエリは(しばらくの間ORMを使用していない)のようなものになります。スペースに注目してください。このコードを更新して、この容易さを理解したからです。
私と同じようにあなたがそれに満足することを願っています。
他のヒント
これを試して:
$user = ORM::factory('user')
->where(DB::expr('lower(email)'), '=', strtolower('alice@spam.com'))
->find();
ヘルパーの使用に完全に満足しているわけではありませんが、他のいくつかのクラスを使用しているので、ロジックを1つの場所に保持するのは素晴らしいことです。これが私が現在使用しているものです。
class DB extends Kohana_DB
{
public static function lower($value)
{
return DB::expr('lower('.Database::instance()->quote($value).')');
}
}
class Model_User extends Model_Base
{
public static function find_by_email($email)
{
$user = ORM::factory('user')
->where(DB::expr('lower(email)'), '=', DB::lower($email))
->find();
return $user;
}
所属していません StackOverflow