【问题标题】:Hidden fields from model appear when model is a relation当模型是关系时,模型中的隐藏字段会出现
【发布时间】:2017-09-04 12:07:54
【问题描述】:

情况

所以这只是发生在我身上。我有 3 个相互关联的模型。我的架构是这样的:

-- 机车车辆

  • 身份证
  • 姓名
  • [...]

-- 用户

  • 身份证
  • 姓名
  • [..]

-- 任务

  • 身份证
  • 说明
  • projectleader_id //对应App\User或App\Group
  • projectleader_type //对应App\User或App\Group
  • rolling_stock_id
  • [...]

我的模特彼此之间有关系:

RollingStock.php

public function task()
{
return $this->hasMany(Task::class);
}

用户.php

public function task()
{
return $this->morphMany(Task::class, 'projectleader');
}

任务.php

public function RollingStock()
{
return $this->belongsTo(RollingStock::class);
}

public function projectleader()
{
return $this->morphTo();
}

在我的用户模型中,我将“密码”和“记住令牌”设置为 $hidden,如下所示:

用户.php

protected $hidden = [
    'password', 'remember_token',
];

问题

通过这个简短的介绍,我现在将带您解决我的问题。当我使用以下查询在我的 RollingStocksController 中获取项目负责人的所有任务时,结果也包括用户模型(作为项目负责人)中的“隐藏”字段。

$rollingStock = RollingStock::with('task.projectleader')->find($id); // ID 与我要获取的 RollingStock 的 ID 匹配)

结果

如果我死了并转储 (dd()) 对象有它的关系,但是如果我循环遍历对象,User model 中的“密码”和“记住令牌”字段在屏幕上是可见和可打印的。

有没有办法隐藏字段,即使模型(渴望)作为关系加载?

【问题讨论】:

标签: laravel eloquent laravel-5.4


【解决方案1】:

$hidden 仅在结果返回为 JSON 时隐藏字段。很容易忘记,但文档的部分标题为"Hiding Attributes From JSON"

在您的控制器中,尝试:

return $rollingStock;

Laravel 会将其转换为 JSON,并且您的隐藏字段不会显示。将其更改为:

dd($rollingStock);

它们出现,因为结果不是 JSON,只是一个转储变量。

【讨论】:

  • 好的...这就是为什么!现在我明白了。所以我必须找到一个解决方案,在我的 Eloquent 查询中对点嵌套关系使用 @Ahsan 方法。
  • 无赖...except() 仅适用于集合而不适用于对象。
  • 哦 :-( 你当然可以unset() 等,但这不是很方便。OTOH 除非你真的选择在视图中显示它们不会显示的字段,对吧?跨度>
  • 非常正确,所以问题不大,但为了安全起见,我想:“没有获取的东西,不能被错误地访问”。而且由于模型上的$hidden 属性,我假设(...)它无论如何都不会显示... ;-)
猜你喜欢
  • 2011-01-06
  • 2011-09-13
  • 2023-03-13
  • 2011-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-31
  • 2011-08-29
相关资源
最近更新 更多