Laravel资源-如何检查给定值是否存在?

时间:2018-07-04 19:40:37

标签: laravel

我正在使用laravel资源来获取api的数据:

        return [
            'id' => $this->id,
            'unread' => $this->unread,
            'contact' => UserResource::collection($this->users),
        ];    

这很好。问题是“用户”为空时。我的意思是-并非每次控制器都从我的关系中加载用户时

    $offers = Offer::where('user_id', $user_id)->orderBy('created_at','desc')->get();
    foreach ($offers as $offer)
    {
        $offer->setRelation('users', $offer->users->unique());
    }
    return OfferShortResource::collection($offers);

有时-此关系不存在。但是关系不是问题,因为-我的资源未加载该关系-relatin已加载到控制器内部。

那么如何为资源添加某种逻辑呢? -基本上来说-用户属性可能不存在-然后不要在此处加载数据,甚至-不要检查$this->users关系

编辑:我试图使它像这样:

 use Illuminate\Support\Arr;
 ...

      'contact' => $this->when(Arr::exists($this, 'users'), function () {
                    return UserResource::collection($this->users);
                }),

但这总是错误的

编辑2:要约模型中的关系

 public function users(){
        return $this->belongsToMany(User::class, 'messages', 'offer_id', 'from')
       ->where('users.id', '!=', auth()->user()->id);

1 个答案:

答案 0 :(得分:9)

尝试使用whereHas

Offer::whereHas('users', function ($query) use ($user_id) {
    $query->where('user_id', $user_id);
})->orderByDesc('created_at')->get();

optional助手对于访问未定义的属性很有用:

optional($this->user)->name

when方法适合您,请尝试以下操作:

'contact' => $this->when(property_exists($this, 'users'), function () {
    return UserResource::collection($this->users);
}),

也尝试:

isset($this->users)