我正在使用Kohana 3的ORM模块使用Postgres,并希望在进行比较之前使用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的新手,因此可以给我同样结果的替代方案也将很有用。

有帮助吗?

解决方案

或恕我直言,甚至贝特(Beter),请尝试以下操作:

$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)“选择用户。注意空间,我刚刚更新了一些代码以使用此功能,因为我只是弄清楚了这种能力。

希望您能像我一样对此感到满意。

其他提示

试试这个:

$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