Ресурсы Laravel - как проверить, существует ли данное значение? - PullRequest
0 голосов
/ 04 июля 2018

Я использую ресурсы 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 отношение

edit: я пытался сделать так:

 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 голосов
/ 04 июля 2018

Попробуйте использовать whereHas:

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

Дополнительный вспомогательный полезен для доступа к свойствам, которые могут быть не определены:

optional($this->user)->name

Метод when должен работать для вас, попробуйте следующее:

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

Также попробуйте:

isset($this->users)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...