如何在Kohana 3 ORM选择查询中使用数据库函数

时间:2010-07-01 21:32:44

标签: postgresql kohana kohana-3 kohana-orm

我正在使用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的新手,所以替代方案会给我相同的结果也很有用。

3 个答案:

答案 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;
    }