Codeigniter ActiveRecord: присоединяйтесь к нам - PullRequest
1 голос
/ 22 октября 2011

У меня простой вопрос: как я могу использовать функцию ActiveRecord join 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 будет между обратными чертами.

Как я могу это сделать?

ОБНОВЛЕНИЕ

Что я хочу?Если 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)

Ответы [ 5 ]

3 голосов
/ 23 октября 2011

Только простой обходной путь, некрасивый, не элегантный, но он работает в этом случае:

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

Если кто-нибудь знает лучше, покажите это!

1 голос
/ 22 октября 2011
$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');
0 голосов
/ 03 октября 2013

Если вы поменяете местами условия И, это сработает! CodeIgniter экранирует только первую часть условия. Итак, это должно работать:

$this->db->join('cimke',"mk_terem.id_kicsoda = 5 AND mk_terem.id_target = cimke.id_cimke", "left")
0 голосов
/ 12 июня 2013

Другим простым решением было бы временно отключить protect_identifiers следующим образом:

$this->db->_protect_identifiers = false;

После выполнения запроса вы можете установить его обратно на true

0 голосов
/ 04 июля 2012

Я знаю, что очень поздно отвечаю на этот вопрос.Просто я делюсь своими знаниями.Это может помочь нам узнать что-то.Если я не прав, пожалуйста, скажите мне.Я отвечаю на этот вопрос полным запросом, который вы разместили на свой вопрос.Пожалуйста, проверьте это ниже.

$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)`

Я полагаю, что все возможно сделать с помощью активной записи codeignitor.Нет необходимости выполнять запрос в $this->db->query() как raw sql.

@ uzsolt: я объясняю это из-за аргумента, приведенного вами в теме "/6000291/napisanie-sql-zaprosov-v-codeigniter-2-0"., и я попробую другие ваши ошибки, которые вы опубликовали вприведенный выше URL слишком короток и свяжемся с вами. Если я что-то не так, пожалуйста, дайте мне знать. Спасибо.:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...