如何使用Laravel控制器在API响应中返回两个一对多的关系?

时间:2017-01-05 14:53:11

标签: laravel laravel-5 eloquent

所以,我有三个模特 - 活动,团体和个人。我正在尝试创建一个API响应,它提供了一个组列表以及每个组中的个人。我已经能够创建一个提供组列表的响应,但我不确定如何正确地包括每个组的个人。

我想过从第一个响应中循环遍历每个响应并为每个响应进行另一个查询,但这看起来有点过分。因此,问题是如何在响应中包含每个组的个人。

我将这三个雄辩的模型定义为:

活动:

public function groups()
{
    return $this->hasMany('App\Group');
}

组:

public function event()
{
    return $this->belongsTo('App\Event');
}
public function individuals()
{
    return $this->hasMany('App\Individual');
}

个人:

public function group()
{
    return $this->belongsTo('App\Group');
}

然后我有我的路线:

Route::get('/events/{id}/groups', 'EventsController@groups');

然后该控制器具有返回组列表的功能:

public function groups($eventId)
{
    $event= Event::find($eventId);
    $groups= $event->groups()->paginate();

    return $groups;
}

非常感谢任何帮助。为了澄清,我会寻找一个类似于:

的回复
{
    id: 1,
    group_name: 'Group Name',
    individuals: [ .. array of individuals .. ]
}

或者,如果某人能够以更好或更标准的方式提供反馈,我也会对此持开放态度。

2 个答案:

答案 0 :(得分:3)

您需要将Eager Loadingwith()方法一起使用:

public function groups($eventId)
{
    $event= Event::find($eventId);
    $groups= $event->groups()->with('individuals')->paginate();

    return $groups;
}

答案 1 :(得分:3)

由于您已经知道事件ID,因此您可以直接使用<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.1/angular.min.js"></script> <div ng-app="myApp"> <div ng-controller="MyCtrl"> Textarea 1 <textarea ng-change="catch(model1)" ng-model="model1"></textarea> <br/> Text area 2 <textarea ng-model="model2"></textarea> <hr/> Textarea1: {{model1}} <br/> Textarea2: {{model2}} </div> </div>模型并使用with()方法加载个人。这段代码只会创建两个查询,而且不那么详细:

Group