【问题标题】:How can I chain ->makeHidden() when eager-loading a belongsToMany relationship?急切加载 belongsToMany 关系时,如何链接 ->makeHidden() ?
【发布时间】:2019-11-23 10:47:51
【问题描述】:

有没有人对在急切加载时如何使用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') 之前修剪掉多余的数据,那就太好了发送。

【问题讨论】:

    标签: laravel eloquent nested eager-loading


    【解决方案1】:

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

    您已经接触过我过去使用过的一种解决方案,即使用select() 将子查询中的关系字段限制为您想要的关系字段,这是排除您的枢轴的一种粗略方法:

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

    这适用于字段有限的情况。但是当您有很多查询或进行很多查询时,它会很痛苦。

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

    【讨论】:

    • 谢谢!既然您已经让我了解了makeVisible() 方法,那么默认隐藏pivot 属性更有意义——因为它通常只携带冗余信息(model_a_id 和model_b_id)。因此,变通方法被证明是最好的解决方案。
    • 如果你想使用makeHidden()$work->work_category->companies->each->makeHidden('pivot');
    • @Jonas - 是的。或 foreach 循环。只是在 Laravel 中没有真正干净地实现。我认为使用 makeVisible() 更严格一些。
    猜你喜欢
    • 2017-09-09
    • 2014-01-19
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多