Mysql
 sql >> Base de données >  >> RDS >> Mysql

comment commander une réponse JSON basée sur la relation de base de données à l'aide d'éloquent

Votre JSON attendu affiche foods en tant qu'enfant de portions . Pour ce faire, vous devez configurer cette relation.

Sur votre Portion modèle, vous devez configurer la relation suivante :

public function foods() {
    return $this->hasMany(Food::class);
}

Avec cette configuration de relation, vous pouvez maintenant obtenir vos données comme ceci :

$categories = App\FoodGroup::with('portions.foods')->get();

Cela chargera vos groupes d'aliments, puis il chargera les portions dans les groupes d'aliments, puis il chargera les aliments dans les portions.

Modifier

J'ai peut-être un peu mal lu votre question. J'ai supposé que vous aviez des portions relation définie sur \App\FoodGroup . Sinon, vous pouvez ajouter ceci comme suit :

Groupe d'aliments :

public function portions() {
    // the second parameter is the name of the pivot table.
    // in this case, your foods table connects your portions and food groups.
    return $this->belongsToMany(Portion::class, 'foods')->distinct();
}

Modifier 2

Cette solution est un peu bidouilleuse car elle traite les foods table comme un tableau croisé dynamique, bien qu'il n'ait pas été spécifiquement conçu pour cela. Pour cette raison, il y a plusieurs entrées dans les foods table contenant les mêmes valeurs de paires de clés, et c'est pourquoi vous obtenez des modèles associés en double.

Si vous lancez un distinct() sur la relation, cela devrait résoudre le problème, car cela éliminera les doublons créés à partir de la jointure interne. Le code ci-dessus a été modifié.