Domanda

Sto usando Postgres con modulo ORM Kohana 3 e vorrei eseguire un SELECT che utilizza un Postgres funzione per convertire i valori già presenti nel database in minuscolo prima di fare il confronto.

In SQL avrei scritto:

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

In Kohana vorrei scrivere qualcosa di simile:

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

Ma questo dà un errore perché ORM sta cercando di dedurre il nome di colonna come 'inferiore (e-mail)' piuttosto che 'e-mail'.

Sono nuovo di Kohana e ORM in modo alternative che mi avrebbe dato lo stesso risultato sarebbe utile anche.

È stato utile?

Soluzione

O IMHO anche beter, provate questo:

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

PS. Non vedo alcuna necessità di creare un :: più bassa () helper DB, ma che potrebbe essere solo me ...

EDIT:

$value = 'alice@spam.com';

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

La query diventerà qualcosa di simile (ORM utilizzato havent in un po ') "SELECT users.id, users.email degli utenti se inferiore (" email ") = LOWER ( 'alice@spam.com') LIMIT 1". Si noti lo spazio, ho appena aggiornato po 'del mio codice per utilizzare questo dato che ho appena capito questa possibilita'.

Spero che sarà felice con lui come lo sono io.

Altri suggerimenti

provare questo:

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

Non sono del tutto soddisfatto con l'uso di un aiuto, ma lo uso un paio di altre classi quindi è bello per mantenere la logica in un unico luogo. Qui è quello che sto attualmente in uso.

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;
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top