2010-07-01 62 views
2

我使用Postgres和Kohana 3的ORM模块,并希望在执行比较之前使用postgres函数将已经在数据库中的值转换为小写字母。如何在Kohana中使用数据库函数3 ORM select查询

在SQL我会写:

select * from accounts where lower(email) = '[email protected]'; 

在Kohana中我想编写这样的事:

$user = ORM::factory('user') 
    ->where('lower(email)', '=', strtolower('[email protected]')) 
    ->find(); 

但是,这给出了一个错误,因为ORM试图推导出列名'降低(电子邮件)'而不仅仅是'电子邮件'。

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

+1

警告:您将要替换DB函数('LOWER')与PHP的一个('strtolower') - 他们可能会或可能不会行为相同的方式取决于多种因素(语言环境,编码,性质输入数据等)。 – 2010-07-01 22:40:01

+0

良好的调用,我添加了一个自定义的DB :: lower方法到我的应用程序,它转义了传入的值并将其包装在较低的位置,因此我现在可以写入: ... - > where(DB :: expr('lower (email)'),'=',DB :: lower($ email)) – 2010-07-01 23:33:18

回答

2

或者恕我直言,即使尤为明显,试试这个:

$user = ORM::factory('user') 
    ->where('LOWER("email")', '=', DB::expr("LOWER('[email protected]')")) 
    ->find(); 

PS。我看不出有任何需要创建一个DB ::较低()辅助,但可能只是我...

编辑:

$value = '[email protected]'; 

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

查询将成为类似(还没有使用ORM在)“SELECT users.id,users.email FROM users WHERE LOWER(”email“)= LOWER('[email protected]')LIMIT 1”。 注意这个空间,我只是更新了一些我的代码来使用它,因为我只是想出了这个可能性。

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

+0

帮助者的使用是为了在转义电子邮件时比较清晰。设想用$ _POST ['email']替换'[email protected]',代码变得更丑陋(或者我不知道如何使它看起来更干净)。你能用一个例子来更新你的答案吗? – 2010-07-02 20:24:00

+0

完成后,我不知道编辑是否足以触发通知,因此我只是将其发布到保存一侧。 – Darsstar 2010-07-02 21:51:52

1

试试这个:

$user = ORM::factory('user') 
    ->where(DB::expr('lower(email)'), '=', strtolower('[email protected]')) 
    ->find(); 
+0

工作完美,谢谢。 – 2010-07-01 22:19:52

0

我对辅助工具的使用并不满意,但是我使用了其他两个类,所以将逻辑保存在一个位置是很好的。这是我目前使用的。

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; 
    } 
相关问题