Как использовать функции базы данных в Kohana 3 ORM Выберите запрос

StackOverflow https://stackoverflow.com/questions/3161852

Вопрос

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

В SQL я бы написал:

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

В Кохане я хотел бы написать что-то вроде этого:

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

Но это дает ошибку, потому что ORM пытается вывести имя столбца как «нижнюю (электронную почту)», а не просто «электронную почту».

Я новичок в Кохана и ORM, так что альтернативы, которые дадут мне, тот же результат тоже будет полезен.

Это было полезно?

Решение

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

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

Придавать Я не вижу, что не нужно создавать БД :: Нижнее () помощник, но это может быть просто я ...

РЕДАКТИРОВАТЬ:

$value = 'alice@spam.com';

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

Запрос станет чем-то вроде (не использовал ORM через некоторое время) «Выберите пользователи. ID, пользователи .email от пользователей, где ниже (« электронная почта ») = нижняя (« alice@spam.com) ограничение 1 ". Обратите внимание на пространство, я только что обновил некоторые из моих кодов, чтобы использовать это, так как я просто выяснил эту позицию.

Я надеюсь, что вы будете счастливы с этим, как я.

Другие советы

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

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

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

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