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

我试图找出一个属性是否被选中,如果它被选中,则将其合并到 API 资源中。


可以说我有这样的事情:


$postA = Post::where('id',  $id)->select(['id', 'title'])->firstOrFail()

$postB = Post::where('id',  $id)->select(['id', 'subtitle'])->firstOrFail()

并且它们都将使用相同的 API 资源:


return PostResource($postA);

OR

return 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。为什么?我该如何解决这个问题?


繁星淼淼
浏览 131回答 1
1回答

慕娘9325324

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)希望这会有所帮助,祝你好运!
打开App,查看更多内容
随时随地看视频慕课网APP