我对 Laravel 还很陌生,我正在尝试弄清楚如何正确地使用 Eloquent,到目前为止一切都很好,但我陷入了我想做的事情中:
如果将迁移算作一个,我在数据库中有 3 个表,4 个表:食物、食物组和部分,其中食物组和部分具有相同的结构,并且 id 作为主键和名称列
食物有
| id(primary) | name | food_group_id (foreign key) | portion_id (foreign key |
一切都很好,因为我的 route 有一个格式很好的 JSON
Route::get('/read', function() {
$categories = App\FoodGroup::with('Foods')->get();
return Response::json(array('data' => $categories));
});
data: [
{
id: 1,
name: "Frutas",
foods: [
{
id: 18,
name: "Acelga",
cant_portion: 2
},
{
id: 19,
name: "Espinaca",
cant_portion: 2
},
]
}
]
如果我用 App\Portion 更改 App\FoodGroup,它会给我相同的数组,但现在作为外键部分排序
我需要的是首先使用 FoodGRoup 订购,并在 FFO_group 的每个项目中订购,现在按第二个外键(即“部分”)订购,这样我就可以拥有这样的东西
data: [
{
id: 1,
name: "Frutas",
portions:[
id: 18,
name: "Gr",
foods: [
{
id: 18,
name: "Acelga",
cant_portion: 2
},
{
id: 19,
name: "Espinaca",
cant_portion: 2
},
]
]
}
]
最佳答案
您预期的 JSON 将 foods
显示为 portions
的子项。为此,您需要设置此关系。
在您的Portion
模型上,您需要设置以下关系:
public function foods() {
return $this->hasMany(Food::class);
}
通过此关系设置,您现在可以获得如下数据:
$categories = App\FoodGroup::with('portions.foods')->get();
这将加载您的食物组,然后将部分加载到食物组中,然后将食物加载到部分中。
编辑
我可能稍微误读了你的问题。我假设您在 \App\FoodGroup
上定义了 portions
关系。如果没有,您可以像这样添加:
食品组:
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();
}
编辑2
这个解决方案有点hacky,因为它将foods
表视为数据透视表,尽管它不是专门为此设计的。因此,foods
表中存在多个包含相同键对值的条目,这就是您获得重复相关模型的原因。
如果您将 distinct()
扔到关系上,这应该可以解决问题,因为它将消除从内部联接创建的重复项。上面的代码已经修改。
关于php - 如何使用 eloquent 根据数据库关系订购 JSON 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35618567/