Laravel渴望加载资源集合

时间:2018-01-04 18:14:10

标签: php laravel eager-loading

如何急切加载资源集合关系?我创建了一个名为gravel_pits关系的资源

class GravelTypeResource extends Resource
{
    public function toArray($request)
    {
        return [
            'id'          => $this->id,
            'name'        => $this->name,
            'deleted_at'  => $this->deleted_at,
            'gravel_pits' => $this->gravel_pits,
        ];
    }
}

关于模型M:M的关系:

public function gravel_pits()
{
    return $this->belongsToMany('App\GravelPit');
}

从API中我得到这样的回复:

public function index()
{
    return GravelTypeResource::collection(GravelType::all());
}

我可以通过

来加载它
public function index()
{
    return GravelTypeResource::collection(GravelType::with('gravel_pits'));
}

哪个有效......但是我无法控制砾石坑的实际特性,相反,急切的负载会将它们全部取出。有一个简单的解决方法吗?

2 个答案:

答案 0 :(得分:0)

您可以传入一个选择以获取您想要的字段。只需确保获得关系所依据的字段:

return GravelTypeResource::collection(GravelType::with('gravel_pits'=>function($query) {
     $query->select(['id', 'gravel_type_id', 'column3', 'column4']);
});

答案 1 :(得分:0)

你可以使用Resource Collections

GravelTypeResourceCollection::make($collection);

并且由于您可以在 eloquent 集合上使用 loadloadMissing,因此您可以这样做

class GravelTypeResourceCollection extends ResourceCollection
{
   $collects = GravelTypeResource::class;

   public function __construct($resource){
        $resource->loadMissing(['gravel_pits']);
        parent::__construct($resource);
    }
}
相关问题