كيفية استخدام وظائف قاعدة البيانات في kohana 3 orm select query

StackOverflow https://stackoverflow.com/questions/3161852

سؤال

أنا أستخدم Postgres مع وحدة ORM الخاصة بـ Kohana 3 وأرغب في تشغيل SELECT باستخدام دالة postgres لتحويل القيم بالفعل في قاعدة البيانات إلى حالة خفض الحالة قبل إجراء المقارنة.

في SQL سأكتب:

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

في كوهانا ، أود أن أكتب شيئًا كهذا:

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

ولكن هذا يعطي خطأ لأن ORM يحاول استنتاج اسم العمود على أنه "أقل (البريد الإلكتروني)" بدلاً من "البريد الإلكتروني".

أنا جديد على Kohana و Orm ، لذا فإن البدائل التي من شأنها أن تعطيني نفس النتيجة ستكون مفيدة أيضًا.

هل كانت مفيدة؟

المحلول

أو Imho حتى Beter ، جرب هذا:

$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();

سيصبح الاستعلام شيئًا مثل (لم يستخدم ORM في حين) "حدد المستخدمين. لاحظ المساحة ، لقد قمت فقط بتحديث بعض الكود الخاص بي لاستخدام هذا لأنني اكتشفت للتو هذه القابلية للتأثير.

أتمنى أن تكون سعيدًا بها كما أنا.

نصائح أخرى

جرب هذا:

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

لست سعيدًا تمامًا باستخدام مساعد ، لكنني أستخدمه فئتين آخرتين ، لذا من الجيد الحفاظ على المنطق في مكان واحد. هذا ما أستخدمه حاليًا.

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;
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top