代码之家  ›  专栏  ›  技术社区  ›  Gerry Shaw

如何在kohana3ormselect查询中使用数据库函数

  •  2
  • Gerry Shaw  · 技术社区  · 14 年前

    我将Postgres与kohana3的ORM模块一起使用,并希望在进行比较之前使用Postgres函数运行SELECT将数据库中已有的值转换为小写。

    在SQL中,我会写:

    select * from accounts where lower(email) = 'alice@spam.com';
    

    在科哈纳,我想这样写:

    $user = ORM::factory('user')
        ->where('lower(email)', '=', strtolower('alice@spam.com'))
        ->find();
    

    但这会产生一个错误,因为ORM试图将列名推断为“lower(email)”,而不仅仅是“email”。

    3 回复  |  直到 14 年前
        1
  •  2
  •   Darsstar    14 年前

    或者更进一步,试试这个:

    $user = ORM::factory('user')
        ->where('LOWER("email")', '=', DB::expr("LOWER('alice@spam.com')"))
        ->find();
    

    另外,我认为没有必要创建DB::lower()助手,但那可能就是我。。。

    编辑:

    $value = 'alice@spam.com';
    
    $user = ORM::factory('user')
        ->where('LOWER("email")', '= LOWER', (array) $value)
        ->find();
    

    注意空格,我刚刚更新了一些代码来使用它,因为我刚刚发现了这个可能性。

    我希望你和我一样满意。

        2
  •  1
  •   antpaw    14 年前

    试试这个:

    $user = ORM::factory('user')
        ->where(DB::expr('lower(email)'), '=', strtolower('alice@spam.com'))
        ->find();
    
        3
  •  1
  •   Gerry Shaw    14 年前

    我对助手的使用并不完全满意,但是我在其他几个类中使用它,所以将逻辑保持在一个位置是很好的。这是我目前正在使用的。

    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;
        }
    
    推荐文章