急切加载 belongsToMany 关系时如何链接 ->makeHidden()?

How can I chain ->makeHidden() when eager-loading a belongsToMany relationship?

有没有人对预先加载时如何使用 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') 关系,并且 WorkCategory 通过枢轴具有 belongsToMany('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') 会更好trim 在发送之前带走额外的数据。

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

您提到了我过去使用过的一种解决方案,即使用 select() 来限制仅在子查询中您想要的关系字段,这是一种粗略的排除方法你的支点:

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

这适用于字段有限的情况。但是,当您有很多问题或正在提出很多问题时,这会很痛苦。

另一种选择是做您已经完成的事情,并在模型上将其标记为受保护:protected $hidden=['pivot'];。然后,您可以 一些 灵活地使用各种方法即时使用 ->makeVisible('pivot'); 重新获得对该枢轴的访问权。