質問

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;
    }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top