У меня есть простой вопрос: как я могу использовать функцию join
ActiveRecord в CodeIgniter? Я хочу это:
LEFT JOIN cimke ON (mk_terem.id_kicsoda=5 AND mk_terem.id_target=cimke.id_cimke) LEFT JOIN tanar ON (mk_terem.id_kicsoda=1 AND mk_terem.id_target=tanar.id_tanar)
Но если я использую $this->db->join(cimke,"mk_terem.id_kicsoda=5 AND mk_terem.id_target=cimke.id_cimke")
, значение 5
будет находиться между $this->db->join(cimke,"mk_terem.id_kicsoda=5 AND mk_terem.id_target=cimke.id_cimke")
.
Как я могу это сделать?
ОБНОВИТЬ
Что я хочу? Если mk_terem.id_kicsoda
равно 1, тогда я хочу tanar.nev
а когда mk_terem.id_kicsoda
равно 5, я хочу cimke.nev
.
Полный SQL-запрос:
SELECT terem.nev terem_nev, elem_tipus.nev tipus_nev, (IFNULL(cimke.nev,tanar.nev)) nev FROM mk_terem LEFT JOIN terem ON mk_terem.id_terem=terem.id_terem LEFT JOIN cimke ON (mk_terem.id_kicsoda=5 AND mk_terem.id_target=cimke.id_cimke) LEFT JOIN tanar ON (mk_terem.id_kicsoda=1 AND mk_terem.id_target=tanar.id_tanar) LEFT JOIN elem_tipus ON (mk_terem.id_kicsoda=elem_tipus.id_kicsoda)
Только простой обходной путь, уродливый, не изящный, но он работает в этом случае:
$original_reserved = $this->db->_reserved_identifiers; $this->db->_reserved_identifiers[] = 5; $this->db->_reserved_identifiers[] = 1; // or any other values $this->db->join('with critical values and conditions'); // some db-stuff $this->db->_reserved_identifiers = $original_reserved;
Если кто-нибудь знает лучше, пожалуйста, покажи это!
$this->db->join('cimke', 'mk_terem.id_target = cimke.id_cimke'); $this->db->join('tanar', 'mk_terem.id_target = tanar.id_tanar'); $this->db->where('mk_terem.id_kicsoda', 5); $this->db->where('mk_terem.id_kicsoda', 1);
или использовать
$this->db->query('AND_YOUR_RAW_SQL_QUERY_HERE');
Я знаю, что очень очень часто отвечаю на этот вопрос. Просто я делюсь своими знаниями. Это может помочь нам кое-что знать. Если я ошибаюсь, скажите мне. Я отвечаю на этот вопрос по полному запросу, опубликованному по вашему вопросу. Пожалуйста, проверьте его ниже.
$this->db->from('mk_terem'); $this->db->select('terem.nev terem_nev, elem_tipus.nev tipus_nev, (IFNULL(cimke.nev,tanar.nev)) nev'); $this->db->join('terem','mk_terem.id_terem=terem.id_terem','left'); $this->db->join('cimke','(mk_terem.id_kicsoda=5 AND mk_terem.id_target=cimke.id_cimke)','left'); $this->db->join('tanar','(mk_terem.id_kicsoda=1 AND mk_terem.id_target=tanar.id_tanar)','left'); $this->db->join('elem_tipus','(mk_terem.id_kicsoda=elem_tipus.id_kicsoda)','left'); $this->db->get();
Я получил запрос, который вы разместили в вопросе как полный запрос. Проверьте это ниже.
SELECT `terem`.`nev` terem_nev, `elem_tipus`.`nev` tipus_nev, (IFNULL(cimke.nev, `tanar`.`nev))` nev FROM (`mk_terem`) LEFT JOIN `terem` ON `mk_terem`.`id_terem`=`terem`.`id_terem` LEFT JOIN `cimke` ON `mk_terem`.`id_kicsoda`=`5` AND mk_terem.id_target=cimke.id_cimke) LEFT JOIN `tanar` ON `mk_terem`.`id_kicsoda`=`1` AND mk_terem.id_target=tanar.id_tanar) LEFT JOIN `elem_tipus` ON `mk_terem`.`id_kicsoda`=`elem_tipus`.`id_kicsoda)`
Я считаю, что все возможно сделать с помощью кодовой записи Active record. Нет необходимости выполнять запрос в $this->db->query()
как raw sql.
@uzsolt: Я объясняю это из-за аргумента, сделанного вами по теме «http://stackoverflow.com/questions/8344769/writing-sql-queries-in-codeigniter-2-0». И я попробую ваши другие ошибки, которые вы разместили по указанному выше URL слишком коротко, и вернитесь к вам. Если я что-то не так, любезно дайте мне знать. Благодарю. 🙂
Другим простым решением было бы временно отключить защиту_identifiers следующим образом:
$this->db->_protect_identifiers = false;
После выполнения запроса вы можете вернуть его в true
Если вы меняете условия вокруг И, это сработает! CodeIgniter только ускользает от первой части условия. Итак, inthis должен работать:
$this->db->join('cimke',"mk_terem.id_kicsoda = 5 AND mk_terem.id_target = cimke.id_cimke", "left")