为了账号安全,请及时绑定邮箱和手机立即绑定

如何检查 API 资源中是否存在字段?

如何检查 API 资源中是否存在字段?

PHP
繁星淼淼 2021-11-13 16:32:12
我试图找出一个属性是否被选中,如果它被选中,则将其合并到 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)

希望这会有所帮助,祝你好运!


查看完整回答
反对 回复 2021-11-13
  • 1 回答
  • 0 关注
  • 130 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信