Pregunta

Estoy usando Postgres con módulo de ORM de Kohana 3 y me gustaría correr un SELECT usando un postgres funcionan para convertir los valores que ya están en la base de datos a minúsculas antes de hacer la comparación.

En SQL que iba a escribir:

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

En Kohana me gustaría escribir algo como esto:

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

Sin embargo, esto da un error porque ORM está tratando de deducir el nombre de la columna como 'inferior (correo electrónico)' en lugar de 'e-mail'.

Soy nuevo en Kohana y ORM por lo alternativas que me daría el mismo resultado sería útil también.

¿Fue útil?

Solución

O en mi humilde opinión, incluso mejor sería, intente esto:

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

PS. No veo ninguna necesidad de crear un ayudante DB :: inferior (), pero que sólo podría ser yo ...

EDIT:

$value = 'alice@spam.com';

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

La consulta se convertirá en algo así como (ORM utilizado havent desde hace tiempo) "SELECT users.id, users.email de los usuarios DONDE INFERIOR (" e-mail ") = INFERIOR ( 'alice@spam.com') LIMIT 1". Observe el espacio, que acaba de actualizar algunos de mi código usar esto desde que acabo de descubrir esta posibilidad.

Espero que sea lo más feliz con él como yo.

Otros consejos

intente lo siguiente:

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

No estoy completamente satisfecho con el uso de un ayudante pero lo uso un par de otras clases lo que es bueno para mantener la lógica en un solo lugar. Esto es lo que estoy usando actualmente.

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;
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top