我试图找出一个属性是否被选中,如果它被选中,则将其合并到 API 资源中。可以说我有这样的事情:$postA = Post::where('id', $id)->select(['id', 'title'])->firstOrFail()$postB = Post::where('id', $id)->select(['id', 'subtitle'])->firstOrFail()并且它们都将使用相同的 API 资源:return PostResource($postA);ORreturn PostResource($postB);然后在 API 资源中,我试图检查是否在select语句中选择了属性:class PostResource extends JsonResource{ public function toArray($request) { return [ 'id' => $this->id, 'title' => $this->when(property_exists($this, 'title'), $this->title), 'subtitle' => $this->when(property_exists($this, 'subtitle'), $this->subtitle) // Other fields and relations ]; }}但 property_exists 不起作用,它总是返回false。为什么?我该如何解决这个问题?
1 回答
慕娘9325324
TA贡献1783条经验 获得超4个赞
Laravel 实际上并没有在模型中以这种方式设置属性。相反,它将它们存储在一个$attributes[]数组中。当您访问一个属性时,该值通过魔术方法返回,该方法__get()通过父Model类继承。
所以,$post->title真的$post->attributes['title']。
此行为的一个简化示例是:
public function __get(string $key)
{
return $this->attributes[$key];
}
至于您的资源,您应该能够使用任何有效的布尔表达式来触发该->when()方法,从而包括或排除您想要的属性。
假设您的titleorsubtitle永远不会存储null在数据库中(空值很好),您应该能够使用以下内容,因为null如果属性不存在,Laravel默认返回。
'title' => $this->when(!is_null($this->title), $this->title),
'subtitle' => $this->when(!is_null($this->subtitle), $this->subtitle)
希望这会有所帮助,祝你好运!
- 1 回答
- 0 关注
- 130 浏览
添加回答
举报
0/150
提交
取消