Na stronie http://docs.joomla.org/Selecting_data_using_JDatabase nie ma udokumentowanej metody pisania podzapytania za pomocą JDatabase.
https://gist.github.com/gunjanpatel/8663333 stanowi przykład jednego ze sposobów osiągnięcia tego celu (pominięto kilka bitów):
$subQuery = $db->getQuery(true);
$query = $db->getQuery(true);
// Create the base subQuery select statement.
$subQuery->select('*')
->from($db->quoteName('#__sub_table'))
->where($db->quoteName('subTest') . ' = ' . $db->quote('1'));
// Create the base select statement.
$query->select('*')
->from($db->quoteName('#__table'))
->where($db->quoteName('state') . ' = ' . $db->quote('1'))
->where($db->quoteName('subCheckIn') . ' IN (' . $subQuery->__toString() . ')')
->order($db->quoteName('ordering') . ' ASC');
// Set the query and load the result.
$db->setQuery($query);
To wydaje się być dobrym, możliwym do przyjęcia podejściem, ale czy jest lepsze?
__toString()
) jest metodą „magiczną”.Odpowiedzi:
Tak, moim zdaniem sposób, w jaki zbudowałeś podkwerendę, został przyjęty przez większość programistów rozszerzeń joomla.
Używam tej samej metody na niektórych moich rozszerzeniach i niestandardowych rozszerzeniach wykonanych dla klientów.
Nie ma „oficjalnego” sposobu na zrobienie tego, ale robienie tego tak, jak pokazano, pozwala korzystać z narzędzia do tworzenia zapytań i nadal zapewnia dobrą czytelność
źródło
AFAIK nie ma wbudowanego sposobu wykonywania łatwych podkwerend, co prawdopodobnie jest wadą systemu i powinno zostać poprawione przez PR.
Jednak nie widzę problemu z twoim przykładem - wydaje się dość rozsądny.
~~~
Oto przykład w odpowiedzi na komentarz @ DavidFritsch poniżej. Im więcej o tym myślę, tym bardziej podoba mi się prostsze podejście przedstawione w PO. Bardziej jasne jest, co się dzieje.
źródło
subQuerySelect
metoda, która pozwoli ci to zrobić nieco „czysto”. Zmienię swoją odpowiedź, aby podać i podać przykład.Istnieje również sposób wykonywania zapytań zawierających podzapytania za pomocą interfejsu API platformy Joomla. Podstawowa idea korzystania z podkwerend opiera się na gunjanpatel .
Oto przykład wykonywania zapytań w modelach zestawów zagnieżdżonych :
Zapytanie SQL:
i przekształcone zapytanie do wykonania przez Joomla:
źródło
Przedstawię moją wersję tego fragmentu, a następnie wyjaśnię moje uzasadnienie i dołączę cytaty z podręcznika Standardy kodowania Joomla (które zostaną sformatowane w formacie queblock).
Najpierw piszę zapytania wewnętrzne i przechodzę do zapytania najbardziej zewnętrznego. To pozwala mi połączyć wszystkie metody budowania zapytań bezpośrednio do
getQuery()
metody. W rzeczywistości nazwa zmiennej jest zapisywana tylko raz podczas budowania pojedynczego zapytania.Oto wspaniały przykład niektórych zagnieżdżonych zapytań (kiedy pomyślałem, że ładnie jest ustawić rzędy w łańcuchach).
Staram się unikać wykonywania wielu
select()
i / lubwhere()
wywołań w ramach tego samego zapytania, ponieważ widziałem, że prowadzi to do zamieszania mniej doświadczonych programistów . Ponieważ metody te akceptują tablice, uważam, że ich stosowanie jest bardziej czytelne i lepsza praktyka kodowania.i wreszcie najbardziej kontrowersyjny temat ...
Jestem bardzo skonfliktowany w tej postawie. Kiedy po raz pierwszy przyszedłem do Joomla w zeszłym roku, pomyślałem, że nie będę wykonywać bezużytecznych połączeń (bez korzyści dla stabilności, bezpieczeństwa, czytelności zapytania) na wartościach statycznych! Jednak mój pracodawca lubi pomysł toeing linię Joomla, i muszę przyznać, że zazwyczaj mają wysokie uznanie dla reguł, więc zostały niwecząc w dół moje zapytania z
quote()
,(int)
iquoteName()
co oznacza również mnóstwo łańcuchów znaków (wszystkie odpowiednio rozmieszczone). Końcowymi rezultatami mojej pracy są strasznie rozdęte bloki zapytań, które nawet ja trudno mi się przyglądać. Najgorsze / najdłuższe linie, które nie nadają się do układania w stosy w pionie, tojoin()
wywołania ze względu na tablename, aliasON
, a następnie jeden lub więcej warunków, które mogą wymagać cytowania lub nie.Rozumiem, że ta polityka jest wdrażana z myślą o bezpieczeństwie dla początkujących programistów, ale z pewnością chciałbym, aby ta polityka została w jakiś sposób zahartowana wrażliwością, że nie wszyscy koderzy Joomla są ignorantami kopiującymi. Mam na myśli, spójrz jak czysty i krótki kod wygląda bez zbędnych wywołań.Jeśli chodzi o wycieranie:
*
w moich klauzulach SELECT__toString()
ASC
ponieważ jest to domyślny kierunek sortowaniaźródło