Hello,
je détail le problème que je rencontre.
Table 1 : places
Table 2 : pictures
La table "pictures" est reliée à la table "places" par une clé étrangère "place_id"
Je souhaite ressortir la liste des "places" AVEC pour chaque place, ses pictures associées.
1 - Je sélectionne des éléments d'une table principale "places"
SELECT id, name, FROM places
WHERE places.city='Paris'
2- Je récupère les résultat dans une variable $places, et Je fais une nouvelle requête pour chaque résultats de la précédente
foreach ($places as $place) {
$place->pictures = "
SELECT pictures.id, pictures.name,
FROM pictures
where pictures.place_id _id in (" . $place->id . ")
";
}
Le résultat de la requête est OK
MAIS PROBLEME : cette façon de faire produit autant de requêtes que de résultats de la première.
Exemple : si $places contient 15 résultats, alors le foreach exécutera 15 requêtes pour ressortir les images de chaque $place.
Le résultat en JSON
[
{
"id": 2,
"name": "Stade Dr Pierre",
"pictures": [
{
"id": 2,
"name": "pic2"
}
]
},
{
"id": 51,
"name": "Stade de France",
"pictures": [
{
"id": 7,
"name": "pic7",
},
{
"id": 8,
"name": "pic8",
}
]
}
]
Faire la même chose en conservant ma 1ere requête intactacte,
mais en optimisant ma deuxème étape pour n'avoir qu' 1 seule requête au lieu de 15 requêtes.
Merci de vos lumières éclairantes :)
Salut,
Ce que tu peux faire, c'est un WHERE ... OR ... OR ...
. Tu auras tous les résultats que tu attends en une seul requête. Par contre, il faudra que tu construises dynamiquement la requête donc fait bien attention que l'utilisateur ne puisse pas casser le tout (soit une injection SQL soit saturer le truc et t'envoyer des milliards de villes, ce qui te ferait un trop grosse requête).
Je ne comprends pas ta logique @tleb, si tu peux l'écrire en version requête SQL, ça me parlerai plus :)
Je précise à nouveau, comme on le voit dans le post initial que la 1ere requête est sur une table "places" et la 2eme requete est sur une table pictures (reliée à "places" par une clé étrangère "place_id")
Je reprécise ce que je cherche :
Sortir la liste des "places", AVEC les "pictures" associées comme suit :
[
{
"id": 2,
"name": "Stade Dr Pierre",
"pictures": [
{
"id": 2,
"name": "pic2"
}
]
},
{
"id": 51,
"name": "Stade de France",
"pictures": [
{
"id": 7,
"name": "pic7",
},
{
"id": 8,
"name": "pic8",
}
]
}
]
Non plus :)
Je Re-précise la contrainte : je DOIS conserver ma 1ere requête INTACTE, c'est à dire sans jointure :)
Mon problème précis : modifier l'étape 2 citée plus haut.
Ce comportement précis est obtenu par exemple avec la méthode ::with du queryBuilder de Laravel
qui s'écrit comme ceci :
Place::with('pictures')->where('city', 'paris')->get()
Cette requête sous Laravel produit seulement 2 requêtes :
1- requête sur la table principale
SELECT * FROM places
2- requête sur la table pictures (supposons ici que la requête précédente ait ressorti les "places" qui ont l'id 1, 3 et 7)
SELECT * FROM Pictures
WHERE pictures.place_id in('1', '3', '7')
3- Puis enfin le résultat présenté en Json associe bien les pictures aux places.
C'est exactement ce que je cherche à reproduire en pur SQL même s'il y a une manipulation de tableau en php à faire pour reconstruire la réponse.