当模型是关系

时间:2017-09-04 12:07:55

标签: laravel eloquent laravel-5.4

情况

所以这发生在我身上。我有3个与彼此有关系的模型。我的架构是这样的:

- RollingStocks

  • ID
  • 名称
  • [...]

- 用户

  • ID
  • 名称
  • [..]

- 任务

  • ID
  • 描述
  • 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);
}

user.php的

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

Task.php

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

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

在我的用户模型中,我将'password'和'remember_token'设置为$hidden,如下所示:

user.php的

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

问题

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

$rollingStock = RollingStock::with('task.projectleader')->find($id); // ID matches the ID of the RollingStock I'm trying to fetch)

结果

如果我死了并转储(dd())对象有它的关系,那么User model中的字段'password'和'remember_token'是可变的,并且如果我循环可以打印到屏幕上物体。

有没有办法隐藏字段,即使模型是(急切地)加载为关系?

1 个答案:

答案 0 :(得分:2)

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

在您的控制器中,尝试:

return $rollingStock;

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

dd($rollingStock);

并且 ,因为结果不是JSON,只是一个转储变量。