3

我正在将 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 试图将列名推断为“lower(email)”而不仅仅是“email”。

我是 Kohana 和 ORM 的新手,所以能给我相同结果的替代方案也会很有用。

4

3 回答 3

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”。注意空间,我刚刚更新了一些代码来使用它,因为我刚刚发现了这种可能性。

我希望你会和我一样开心。

于 2010-07-02T09:09:33.390 回答
1

试试这个:

$user = ORM::factory('user')
    ->where(DB::expr('lower(email)'), '=', strtolower('alice@spam.com'))
    ->find();
于 2010-07-01T21:37:31.457 回答
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;
    }
于 2010-07-02T20:28:45.633 回答