Как использовать функции базы данных в Kohana 3 ORM select query - PullRequest
2 голосов
/ 02 июля 2010

Я использую Postgres с модулем ORM Kohana 3 и хотел бы выполнить SELECT с использованием функции postgres для преобразования значений, уже находящихся в базе данных, в нижний регистр перед выполнением сравнения.

В 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, так что альтернативы, которые дали бы мне тот же результат, тоже были бы полезны.

Ответы [ 3 ]

2 голосов
/ 02 июля 2010

Или ИМХО даже лучше, попробуйте это:

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

PS. Я не вижу необходимости создавать помощник DB :: lower (), но это может быть только я ...

EDIT:

$value = 'alice@spam.com';

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

Запрос станет чем-то вроде (некоторое время не использовавшим ORM) «SELECT users.id, users.email ОТ пользователей WHERE LOWER (« email ») = LOWER ('alice@spam.com') LIMIT 1". Обратите внимание на пространство, я только что обновил часть своего кода, чтобы использовать это, так как я только что выяснил эту возможность.

Надеюсь, вы будете так же счастливы, как и я.

1 голос
/ 03 июля 2010

Я не совсем доволен использованием помощника, но я использую его пару других классов, поэтому неплохо хранить логику в одном месте.Вот что я сейчас использую.

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;
    }
1 голос
/ 02 июля 2010

попробуйте это:

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