sql >> Base de Datos >  >> RDS >> Mysql

cómo ordenar una respuesta JSON basada en la relación de la base de datos usando elocuente

Tu JSON esperado muestra foods como hijo de portions . Para hacer esto, debe configurar esta relación.

En tu Portion modelo, debe configurar la siguiente relación:

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

Con esta configuración de relación, ahora puede obtener sus datos de esta manera:

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

Esto cargará sus grupos de alimentos, luego cargará las porciones en los grupos de alimentos y luego cargará los alimentos en las porciones.

Editar

Puede que haya leído un poco mal tu pregunta. Supuse que tenías portions relación definida en \App\FoodGroup . Si no, puedes agregar esto así:

Grupo Alimenticio:

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();
}

Editar 2

Esta solución es un poco complicada porque está tratando los foods table como una mesa dinámica, aunque no fue diseñada específicamente para eso. Debido a esto, hay varias entradas en foods tabla que contiene los mismos valores de par de claves, y es por eso que obtiene modelos relacionados duplicados.

Si lanzas un distinct() sobre la relación, esto debería solucionar el problema, ya que eliminará los duplicados creados a partir de la unión interna. El código anterior ha sido modificado.