Hej.

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:

  1. 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:

  1. array(3) {
  2. [0]=>
  3. array(2) {
  4. ["id"]=>
  5. string(1) "1"
  6. ["file_name"]=>
  7. string(20) "file 1 for product 1"
  8. }
  9. [1]=>
  10. array(2) {
  11. ["id"]=>
  12. string(1) "1"
  13. ["file_name"]=>
  14. string(20) "file 2 for product 2"
  15. }
  16. [2]=>
  17. array(2) {
  18. ["id"]=>
  19. string(1) "2"
  20. ["file_name"]=>
  21. string(20) "file 1 for product 2"
  22. }
  23. }


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ę:

  1. //tutaj normalny nieprzydatny array, taki jak podałem na górze:
  2.  
  3. $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();
  4.  
  5. //a tu przygotowywuję wygodniejszy array:
  6. $arr=array();
  7. foreach($arr0 as $a){
  8. $prod_id=$a['id'];
  9. if(!isset($arr[$prod_id])){
  10. $arr[$prod_id]=$a;
  11. $arr[$prod_id]['images']=array();
  12. }
  13. $arr[$prod_id]['images'][]=$a['file_name'];
  14. }


No i teraz array wygląda lepiej:

  1. array(2) {
  2. //array dla produktu o id 1
  3. [1]=>
  4. array(3) {
  5. ["id"]=>
  6. string(1) "1"
  7. ["file_name"]=>
  8. string(20) "file 1 for product 1"
  9. ["images"]=>
  10. array(2) {
  11. [0]=>
  12. string(20) "file 1 for product 1"
  13. [1]=>
  14. string(20) "file 2 for product 2"
  15. }
  16. }
  17. [2]=>
  18. //array dla produktu o id 2
  19. array(3) {
  20. ["id"]=>
  21. string(1) "2"
  22. ["file_name"]=>
  23. string(20) "file 1 for product 2"
  24. ["images"]=>
  25. array(1) {
  26. [0]=>
  27. string(20) "file 1 for product 2"
  28. }
  29. }
  30. }


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?