Как использовать функции базы данных в Kohana 3 ORM Выберите запрос
-
02-10-2019 - |
Вопрос
Я использую 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;
}