2015-10-22 12 views
6

Mam wiele tabel, które łączą się ze sobą i potrzebuję jednego zapytania i uzyskać wszystkie odniesienia też!
jest to możliwe w Yii2?
uzyskać je w tablicy hierarchii?
Jak?Jak uzyskać tabelę z odniesieniami do innej tabeli w yii2?

Czy można nie używać łączenia ???

dziękuję za pomoc !!!!

sample db

+0

Dlaczego ** nie chcesz używać złączeń? – Sjon

+0

jest możliwe bez dołączenia? Lazyloading czy coś takiego !! – mohsen

+0

Myślę, że łączenie też jest lepsze. Czy możesz powiedzieć nam więcej o tym, jak chcesz wydrukować? –

Odpowiedz

1

Jeśli utworzyłeś klasy modelu dla każdej tabeli przy użyciu Gii i wybrano do utworzenia relacji w wygenerowanych modelach, możesz zrobić coś takiego.

1) w waszych krajach wzór wystarczy zmienić metodę, która deklaruje związek z Lotniska takiego:

public function getAirports() { 
    return $this->hasMany(Airports::className(), ['country_id' => 'id'])->with('airlines'); 
} 

2) Po wykonaniu kwerendy dla krajów i trzeba mieć związane lotnisk, linii lotniczych i flightbooked zrobić to tak:

$countries = Countries::find() 
    ->where('something = something_else') 
    ->with('airports') 
    ->with('flightbooked') 
    ->all(); 

w ten sposób można uzyskać wszystkie związane z nimi modele zapełnione wiele mniej zapytań do bazy danych niż przy użyciu leniwy załadunku.

0

Może u można użyć UNION ALL do tego. Za pomocą tego operatora można łączyć zestawy wyników z wielu zapytań, zachowując wszystkie wiersze z każdego z nich. Zauważ, że operator UNION (bez słowa kluczowego ALL) wyeliminuje wszystkie "duplikaty" wierszy, które istnieją w zestawie wyników. Operator UNION ALL zachowuje wszystkie wiersze z każdego zapytania (i prawdopodobnie będzie działał lepiej, ponieważ nie ma nakładu związanego z wykonywaniem operacji duplikowania czeku i usuwania).

Liczba kolumn i typ danych każdej kolumny musi być zgodny w każdym z zapytań. Jeśli jedno z zapytań ma więcej kolumn niż drugie, czasami dodajemy wyimaginowane wyrażenia w drugim zapytaniu, aby kolumny i typy danych były "zgodne". Często pomocne jest dołączenie wyrażenia (dodatkowej kolumny) do listy SELECT każdego zapytania, które zwraca literał, aby ujawnić, które z zapytań było "źródłem" wiersza.

SELECT 'col1' AS source, col23, col343, col33, d FROM table1 WHERE ... 
UNION ALL 
SELECT 'col2', t2.fee, table2.fi, table2.fo, 'fum' FROM table2 JOIN table3 ON ... 
UNION ALL 
SELECT 'col3', '1', '2', buckle, my_shoe FROM table4 

Można owinąć zapytania jak to w zestawie nawiasie i używać go jako widoku inline (lub „tabela pochodzi”, w MySQL slangu), dzięki czemu można wykonywać operacje zbiorcze na wszystkie wymienione wydziwianie. np .:

select one.a 
    , SUM(one.b) 

    FROM (
     SELECT 'q1' AS source, a, b, c, d FROM t1 
      UNION ALL 
     SELECT 'q2', t2.fee, t2.fi, t2.fo, 'fum' FROM t2 
     ) one 
GROUP BY one.a 
ORDER BY one.a 

Ale myślę, że łączenie tabel bardziej odpowiednie. Nadzieję pomóc

+0

Tak, myślę, że łączenie jest lepsze! – mohsen

1

Chciałem tylko dać małą sugestię:

Jak utrzymujemy relacje w tabelach, a jeśli masz wygenerowany kod przy użyciu Gii, to wygeneruje dołączy do Ciebie. Możesz wtedy uzyskać dostęp do dowolnej kolumny dowolnego stołu.

Ale myślę, że UNION nie może być alternatywą dla JOIN.

Powiązane problemy