Intereting Posts

Codeigniter ActiveRecord: присоединиться к обратному обращению

У меня есть простой вопрос: как я могу использовать функцию 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")