Question

J'utilise Postgres avec le module ORM de Kohana 3 et que vous souhaitez exécuter un SELECT en utilisant une fonction postgres pour convertir les valeurs déjà dans la base de données en minuscules avant de faire la comparaison.

Dans SQL Je voudrais écrire:

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

Kohana je voudrais écrire quelque chose comme ceci:

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

Mais cela donne une erreur, car ORM tente d'en déduire le nom de colonne « (e-mail) inférieur » plutôt que « e-mail ».

Je suis nouveau à Kohana et ORM donc des alternatives qui me donnerait le même résultat serait utile aussi.

Était-ce utile?

La solution

Ou à mon humble avis, même Beter, essayez ceci:

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

PS. Je ne vois pas la nécessité de créer une aide DB :: inférieure (), mais cela pourrait être juste moi ...

EDIT:

$value = 'alice@spam.com';

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

La requête sera quelque chose comme (havent utilisé ORM dans un certain temps) "SELECT users.id, users.email FROM utilisateurs WHERE INFÉRIEUR (" email ") = LOWER ( 'alice@spam.com') LIMIT 1". Notez l'espace, je viens mis à jour une partie de mon code pour utiliser ce que je viens de comprendre ce posibility.

J'espère que vous serez aussi heureux avec ce que je suis.

Autres conseils

essayez ceci:

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

Je ne suis pas entièrement satisfait de l'utilisation d'une aide mais j'utiliser un couple d'autres classes il est donc agréable de garder la logique dans un seul endroit. Voici ce que je suis actuellement à l'aide.

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;
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top