3

Kohana 3 の ORM モジュールで Postgres を使用しており、postgres 関数を使用して SELECT を実行し、比較を行う前にデータベース内の値を小文字に変換したいと考えています。

SQL では、次のように記述します。

select * from accounts where lower(email) = 'alice@spam.com';

Kohana では、次のように書きたいと思います。

$user = ORM::factory('user')
    ->where('lower(email)', '=', strtolower('alice@spam.com'))
    ->find();

ただし、ORM は列名を単に「email」ではなく「lower(email)」と推測しようとしているため、これはエラーになります。

私はKohanaとORMが初めてなので、同じ結果が得られる代替手段も役立ちます。

4

3 に答える 3

2

または、私見はさらに良いです、これを試してください:

$user = ORM::factory('user')
    ->where('LOWER("email")', '=', DB::expr("LOWER('alice@spam.com')"))
    ->find();

PS。DB::lower() ヘルパーを作成する必要はないと思いますが、それは私だけかもしれません...

編集:

$value = 'alice@spam.com';

$user = ORM::factory('user')
    ->where('LOWER("email")', '= LOWER', (array) $value)
    ->find();

クエリは (しばらくの間 ORM を使用していません) "SELECT users.id, users.email FROM users WHERE LOWER("email") = LOWER ('alice@spam.com') LIMIT 1" のようになります。スペースに注意してください。この可能性を理解したばかりなので、これを使用するようにコードの一部を更新しました。

私と同じようにあなたがそれに満足してくれることを願っています。

于 2010-07-02T09:09:33.390 に答える
1

これを試して:

$user = ORM::factory('user')
    ->where(DB::expr('lower(email)'), '=', strtolower('alice@spam.com'))
    ->find();
于 2010-07-01T21:37:31.457 に答える
1

ヘルパーの使用に完全に満足しているわけではありませんが、他のいくつかのクラスでヘルパーを使用しているため、ロジックを 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;
    }
于 2010-07-02T20:28:45.633 に答える