【问题标题】:Laravel eager load resource collectionLaravel 急切加载资源收集
【发布时间】:2018-01-04 18:14:09
【问题描述】:

如何预先加载资源集合关系?我创建了一个调用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'));
}

这行得通...但是我无法控制我真正想要返回的砾石坑的哪些属性,相反,急切的负载会全部获取。有没有简单的解决方法?

【问题讨论】:

  • ::with('author:id,name') 直接来自documentation
  • @Kyslk 哦,漂亮的 5.5 功能!
  • 是的 :),您没有指定哪个版本,所以我假设为 :latest
  • 如果有5个模型调用它? :) 如果有什么变化,我将不得不更改所有 5 个调用...不是真正的 DRY 解决方案 :)
  • 玩关系定义。使用存储库模式(不要!:D - 我个人反对)尝试在其他地方干燥它,使用 IDE 查找+替换。

标签: php laravel eager-loading


【解决方案1】:

你可以使用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);
    }
}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-13
      • 2021-04-23
      • 2018-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-09
      • 2013-05-28
      相关资源
      最近更新 更多