كيفية استخدام وظائف قاعدة البيانات في kohana 3 orm select query
-
02-10-2019 - |
سؤال
أنا أستخدم 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;
}