php - 如何使用 eloquent 根据数据库关系订购 JSON 响应

标签 php mysql laravel

我对 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/

相关文章:

mysql - UNION SELECT 的问题

mysql - 如何以简短而优雅的方式编写sql查询?

php - Laravel 5.2 身份验证不适用于前缀组下的隐式路由

php - 在PHP中用表达式(连接字符串)初始化类成员变量

php - 单击时触发跟踪像素

php - 如何使用PHP CURL绕过跨域

mysql - 如何填补每周数据的空白?

PHP 方法只能运行一次 [SQL]

php - 传递给 array_sort() 的参数 2 必须是可调用的,给定字符串

php - 通过多态使用 Laravel Eloquents HasManyThrough 关系与多个关系