分页关系

时间:2019-02-07 17:37:21

标签: laravel eloquent

使用分页时,我在返回两个关系的数据时遇到问题。

$things = $this->model->with('fruits')->with('animals')->paginate(5, ['id, 'name']);

返回我想要的“事物”,但是“水果”和“动物”数组为空。

为弄清关系,我们检查出事物“有很多”的果实,并且“有很多通过(水果)的”动物。

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

public function animals()
{
    return $this->hasManyThrough('\App\Animal', '\App\Fruit');
}

我希望能够加载“事物”以及任何关系,同时能够对“事物”进行分页

1 个答案:

答案 0 :(得分:0)

with()仅告诉Eloquent预取相关模型,因此可以避免N + 1查询问题。这并不意味着当您返回模型时,也会返回该信息。

我将创建一个雄辩的资源:

Class FruitResource extends \Illuminate\Http\Resources\Json\Resource {
    public function toArray($request) {
        return [
            'id' => $this->id,
            'name' => $this->name
        ];
    }
}


Class AnimalResource extends \Illuminate\Http\Resources\Json\Resource {
    public function toArray($request) {
        return [
            'id' => $this->id,
            'name' => $this->name
        ];
    }
}

Class ThingResource extends \Illuminate\Http\Resources\Json\Resource {
    public function toArray($request) {         
        return [
            'id' => $this->id,
            'fruits' => FruitResource::collection($this->fruits),
            'animals' => AnimalResource::collection($this->animals)
        ];
    }
}

创建这些资源后,您可以更改控制器以执行以下操作:

$things = $this->model->with('fruits')->with('animals')->paginate(5, ['id, 'name']);
return ThingsResource::make($things);

通过构造资源,您可以轻松地获得对返回内容的更多控制。让生活变得更加美好...