أمس كنت اعمل على مشروع ومن ضمن هذا المشروع جزء خاص بعملية البحث في قاعدة البيانات وعند الشروع في كتابة الكود واجهتني مشكلة أراها انها نقص في أطار العمل كود إجنيتور، المشكلة كالتالي:
عند كتابة الأوامر التالية
$this->db->where('article_status', 'published');
$this->db->like('article_title', $search_query);
$this->db->like('article_content', $search_query);
$this->db->get('articles');
فستكون نتيجة أستعلام الـ MySQL هي
SELECT * FROM (`articles`) WHERE `article_status` = 'published' AND `article_title` LIKE '%كلمة البحث%' AND `article_content` LIKE '%كلمة البحث%'
المشكلة هنا اذا كانت كلمة البحث موجودة في عنوان المقال وغير موجودة في المحتوى فسوف نفقد احد نتائج البحث واذا استبدلنا أمر الـ LIKE الثاني بـ OR LIKE للحصول على هذه النتيجة فسوف يتم تجاهز أمر الـ WHERE الأول وسوف تظهر لنا من ضمن البحث المقالات الغير منشورة.
عندها قلت لنفسي يجب ان يكون هناك امر لكي يجعل أمر الـ WHERE أو الـ LIKE في مجموعة مع بعضهم لكي تكون النتيجة كالتالي
SELECT * FROM (`articles`) WHERE `article_status` = 'published' AND (`article_title` LIKE '%كلمة البحث%' OR `article_content` LIKE '%كلمة البحث%')
ولكن للأسف كود إجنيتور خذلني هذه المرة، ولكن الحمد لله وجدت حل لهذه المشكلة بخدعة بسيطة وهي كالتالي
$this->db->where('article_status', 'published');
$this->db->where(sprintf( '(`article_title` LIKE %1$s OR `article_content` LIKE %1$s)', $this->db->escape('%' . $search_query . '%') ));
$this->db->get('articles');