2013-01-10 19 views
5

możliwe jest generowanie następujące zapytanie przez klasy CI Query Builder?CodeIgniter JOIN (zapytanie SELECT

SELECT name 
     FROM table1 t1 
        JOIN 
        (SELECT ID FROM table2 ORDER BY id LIMIT 5) t2 
        ON t2.id=t1.t2_id 
     WHERE t1.id>5 

Odpowiedz

15

Otóż istnieje kilka sposobów robi. Jednym ze sposobów jest tutaj, które jest hack.

How can I rewrite this SQL into CodeIgniter's Active Records?

Ten drugi sposób jest bardzo prosty.

$this->db 
     ->select('ID') 
     ->from('table2') 
     ->order_by('id') 
     ->limit('5'); 

$subquery = $this->db->_compile_select(); 

$this->db->_reset_select(); 

$query =  $this->db 
        ->select('t1.name') 
        ->from('table1 t1 ') 
        ->join("($subquery) t2","t2.id = t1.t2_id") 
        ->get('table1 t1'); 

Trochę na ten temat.
Jesteś zobowiązany do użycia z klauzuli w podzapytaniach, ponieważ pobiera uruchamia kwerendę.
W codeigniter 2 _compile_select i _reset_select nie mogą być dostępne, ponieważ są metodami chronionymi.
Może być konieczne usunięcie słowa kluczowego przed użyciem obu metod w pliku system/database/DB_active_rec.php

This.

+0

Prosiłem się o ** Kreator kwerend CI ** nie zapytanie nieprzetworzone, mogę uruchomić zapytanie surowe o'c, –

+0

Cóż, dodałem linki dwóch artykułów, których nawet nie widziałem, mówią dokładnie, jak to zrobić . Jedna to moja własna odpowiedź. Chcesz się przyjrzeć? –

+0

i dlaczego umieściłeś gorszą odpowiedź na ten temat? Drugi link wygląda dobrze, może być najlepszym sposobem na zrobienie tego –

0

Ta biblioteka może pomóc wykorzystać sub zapytania z konstruktora zapytań mieć wyraz doc tej biblioteki

sub query with query builder

+0

byłby użyteczny, gdyby został zaimplementowany jako 'group_start() ' –

+0

cóż, możesz dodać tę funkcję do tej biblioteki i dzielić się z deweloperem na github będzie przydatna dla innych programistów też – umefarooq

+0

zrobi, gdy mam na to czas i znam CI więcej niż teraz –

1

w CI3, wystarczy użyć czwarty parametry ucieczki

$this->db->from('table') 
->join('SELECT id from table2 where something=%s) as T2'),'table.id=T2.id', 'LEFT',NULL) 
->get()->row(); 

Nie zapomnij o pominięciu parametrów w swoim podzapytaniu, aby uniknąć iniekcji SQL.

+0

** przez klasę konstruktora zapytań ** –