Mam takie podstawowe pytanie, mam na nie swoje rozwiązanie, które stosuję od dawna, ale właśnie mi przyszło do głowy, że może istnieje jakieś lepsze.
Powiedzmy, że mamy dwie tabelki, products i products_images.
Tabelka products wygląda tak: id, name. Natomiast products_images (obrazki do produktów) tak: id, product_id, file_name
Powiedzmy, że w "products" mamy dwa produkty o id 1 i id 2. Teraz w products_images mamy:
id product_id file_name
1 1 file 1 for product 1
2 1 file 2 for product 1
3 2 file 1 for product 2
Czyli mamy dwa obrazki dla produktu o id 1 i jeden obrazek dla produktu o id 2.
Robimy zapytanie:
SELECT products.id,products_images.file_name AS file_name FROM products JOIN products_images ON products_images.product_id=products.id
I w wyniku tego mamy mało przydatny array:
[0]=> ["id"]=> string(1) "1" ["file_name"]=> string(20) "file 1 for product 1" } [1]=> ["id"]=> string(1) "1" ["file_name"]=> string(20) "file 2 for product 2" } [2]=> ["id"]=> string(1) "2" ["file_name"]=> string(20) "file 1 for product 2" } }
Chciałbym uzyskać coś bardziej ludzkiego, tzn. array z dwoma produktami i tam pod-arraye z obrazkami, tak więc robię zawsze taką pętęlkę:
//tutaj normalny nieprzydatny array, taki jak podałem na górze: $arr0=\App::$db->query("select products.id,products_images.file_name as file_name from products join products_images on products_images.product_id=products.id")->result(); //a tu przygotowywuję wygodniejszy array: foreach($arr0 as $a){ $prod_id=$a['id']; $arr[$prod_id]=$a; } $arr[$prod_id]['images'][]=$a['file_name']; }
No i teraz array wygląda lepiej:
//array dla produktu o id 1 [1]=> ["id"]=> string(1) "1" ["file_name"]=> string(20) "file 1 for product 1" ["images"]=> [0]=> string(20) "file 1 for product 1" [1]=> string(20) "file 2 for product 2" } } [2]=> //array dla produktu o id 2 ["id"]=> string(1) "2" ["file_name"]=> string(20) "file 1 for product 2" ["images"]=> [0]=> string(20) "file 1 for product 2" } } }
No i robię to za każdym razem gdy robię jakiś join z relacją inną niż jeden do jeden a chcę mieć ładny array.
I tu pytanie - nie da się tego robić jakoś sprytniej?