首页 > 解决方案 > 急切加载 belongsToMany 关系时,如何链接 ->makeHidden() ?

问题描述

有人对makeHidden()急切加载时如何使用有任何建议吗?这是我的代码:

        $work=Work::with([
            'work_category'=>function($query){
                $query->with(['companies'=>function($query){
                    $query->select('companies.id','companies.name');
                }]);
            },
            'prices',
        ])
        ->findOrFail($id);

Work 有一个belongsTo('App\WorkCategory')关系,WorkCategorybelongsToMany('App\Company')通过一个支点建立一个关系。

如果我尝试链接->makeHidden('pivot')$query->select('companies.id','companies.name');- 我得到一个BadMethodCall exception: Call to undefined method Illuminate\Database\Eloquent\Relations\BelongsToMany::makeHidden()

我在这里缺少什么吗?

这是有问题的 makeHidden() 调用的代码

        $work=Work::with([
            'work_category'=>function($query){
                $query->with(['companies'=>function($query){
                    $query->select('companies.id','companies.name')->makeHidden('pivot');
                }]);
            },
            'prices',
        ])
        ->findOrFail($id);

我的临时解决方案是添加protected $hidden=['pivot'];到我的公司模型中,但是如果我确实需要它能够访问枢轴,并$model->relation->makeHidden('attribute')在我的控制器中使用它来在发送之前修剪掉额外的数据,那就太好了。

标签: laraveleloquentnestedeager-loading

解决方案


不幸的是,makeHidden()它不适用于 Laravel 中的关系。不直接也不在相关字段上使用点符号。

您已经触及了我过去使用过的一种解决方案,该解决方案用于select()将子查询中的关系字段限制为您想要的关系字段,这是一种排除您的数据透视的粗略方法:

$query->with(['companies'=>function($query){
     $query->select('id','name', 'something', 'something');
}]);

这在字段有限时有效。但是当您有很多查询或进行很多查询时,它会很痛苦。

另一种选择是做你所做的,并在模型上标记它受保护:protected $hidden=['pivot'];. 然后,您可以灵活地使用各种方法->makeVisible('pivot');动态重新获得对该枢轴的访问权。


推荐阅读