我正在使用Postgres和Kohana 3的ORM模块,并希望使用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正试图将列名称推断为“较低(电子邮件)”,而不仅仅是“电子邮件”。
我是Kohana和ORM的新手,所以替代方案会给我相同的结果也很有用。
答案 0 :(得分: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”。 注意这个空间,我刚刚更新了一些代码来使用它,因为我刚想出了这个可能性。
我希望你和我一样快乐。
答案 1 :(得分:1)
试试这个:
$user = ORM::factory('user')
->where(DB::expr('lower(email)'), '=', strtolower('alice@spam.com'))
->find();
答案 2 :(得分: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;
}