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

gil*_*usz 5 laravel

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

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

这工作正常.问题是'用户'是空的.我的意思是 - 不是每次我的控制器从我的关系中加载用户:

    $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);
Run Code Online (Sandbox Code Playgroud)

有时 - 这种关系不存在.但不是关系是问题,因为 - 我的资源没有加载关系 - relatin被加载到控制器内.

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

编辑:我试着这样做:

 use Illuminate\Support\Arr;
 ...

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

但这总是假的

编辑2:Offer模型中的关系

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

Dig*_*ter 10

尝试使用whereHas:

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

可选的辅助是用于访问可能不被定义的性质是有用的:

optional($this->user)->name
Run Code Online (Sandbox Code Playgroud)

when方法应该适合您,尝试以下方法:

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

还试试:

isset($this->users)
Run Code Online (Sandbox Code Playgroud)