如何正确隐藏模型关系以防止返回 toArray() 或 toJson()?

Posted

技术标签:

【中文标题】如何正确隐藏模型关系以防止返回 toArray() 或 toJson()?【英文标题】:How do I correctly hide model relationships from returning in toArray() or toJson()? 【发布时间】:2020-01-13 23:32:25 【问题描述】:

我目前正在编写一个 API 的项目,并且对于很多模型,我试图隐藏它们的父关系以防止返回,就像这样

<?php namespace Viper\Model;

class User_Token extends Eloquent 

    protected $table = 'users_tokens';

    protected $fillable = array(
        'user_id', 'token'
    );

    protected $hidden = array(
        'id', 'user_id', 'user'
    );

    public function user() 
        return $this->belongsTo('User');
    


在 Laravel 文档中,对于 Eloquent > Converting to Array or Json 部分,它明确表示

注意:隐藏关系时,使用关系的方法名, 不是动态访问器名称。

这究竟是什么意思?在上面的示例中,方法名称和动态访问器名称都是相同的,我一辈子都想不出这种情况。

【问题讨论】:

【参考方案1】:
protected $hidden = array(
        'id', 'user_id', 'user'
                           ^^^ relationship's method name which is "user"
);

如果你想隐藏关系,你必须在隐藏属性下包含method name。从您的隐藏属性中,我可以看到,您完美地隐藏了 user 关系,以防止数组和 JSON 转换。但是,如果您的 users_tokens 表中有“用户”列,我不知道 Laravel 会做什么。

public function user() 
    return $this->belongsTo('User');

【讨论】:

我所有的方法和列名都是专门选择的,这样它们就不会冲突。我只是不明白方法名称和动态访问器名称之间的区别,因为访问器名称是从方法名称派生的...... 谢谢,这项工作非常适合我。所以如果我有 userPhone() 关系,laravel 会将 user_phone 放入 json。所以我不得不把'userPhone'放在$hidden数组而不是user_phone中。希望这对某人有所帮助。【参考方案2】:

我遇到了同样的问题,并决定通过 PR 向 Laravel 文档澄清这一点。 似乎没有区别,而且那个注释是不正确的。

https://github.com/laravel/docs/pull/3351

【讨论】:

以上是关于如何正确隐藏模型关系以防止返回 toArray() 或 toJson()?的主要内容,如果未能解决你的问题,请参考以下文章

如果 rowData 为空,如何隐藏 ag-grid?

机器学习中的数据泄露是什么?构建模型中如何防止数据泄露?正确的方案是什么?如何使用pipeline防止数据泄露?

Laravel Eloquent ORM 无法正确返回模型的关系

如何删除excel中数字上的隐藏引号,以防止更改格式

Java Collections的两个toArray()函数有什么区别?

Spark中来自关系数据模型的树/嵌套结构