Попытка вернуть сводные данные в Resource Laravel - PullRequest
1 голос
/ 12 февраля 2020

Я пытаюсь вернуть сводные данные на ресурс. Сводная таблица работает, я могу добавлять и удалять записи, как ожидалось, но я не могу получить user_id, возвращенный в ActivityResource ... В документации Laravel это выглядит так просто, я что-то упустил?

// Activity.php
class Activity extends Model
{
    public function members()
    {
        return $this->belongsToMany('App\User', 'activity_user', 'user_id', 'activity_id')->withPivot('activity_id','user_id')->withTimestamps();
    }
}
// User.php
class User extends Authenticatable
{
    public function joinedactivities()
    {
        return $this->belongsToMany('App\Activity');
    }
}

В моем ActivityController я хочу вернуть только что созданный ActivityResource с «загруженным» отношением

// ActivityController 
public function show($id)
{
    $activity = Activity::with('members')->findOrFail($id);

    /* foreach ($activity->members as $user) {
        echo $user->id . " "; // With this I can actually see the right ids
    }
    return;*/

    return new ActivityResource($activity);
}

ActivityResource:

public function toArray($request)
{
    return [
        'id' => $this->id,
        'title' => $this->title,
        'attendees' => $this->whenPivotLoaded('activity_user', function () {
            return $this->pivot->user_id;
        }),
    ];
}

Я не получаю никаких ошибок вместо этого поле участников просто не возвращается. Я пробовал так много вещей, борясь с этим. Помощь очень ценится. Я использую Laravel 6.

1 Ответ

1 голос
/ 13 февраля 2020

->withPivot('activity_id','user_id') не требуется. Эти поля появятся на вашем объекте отношений, несмотря ни на что. Что касается ресурса, я думаю, что вы можете сделать следующее:

public function toArray($request)
{
    return [
        'id' => $this->id,
        'title' => $this->title,
        // If the relation 'members' is loaded, get an array of user ids otherwise, return null
        'attendees' => $this->relationLoaded('members') ? $this->members->pluck('pivot.user_id')->unique()->all() : null
    ];
}

Основная проблема заключается в том, что отношение «многие ко многим» означает, что существует более 1 пивота. С этим решением ваш объект будет выглядеть следующим образом.

{
    id: 3,
    title: 'A Title',
    attendees: [
        1,
        2,
        3,
    ],
}

Если вы хотите, чтобы идентификаторы были объединены в одну строку, как в вашем комментарии foreach, замените all() на join(' ')

// If the relation 'members' is loaded, get an string of user ids otherwise, return null
'attendees' => $this->relationLoaded('members') ? $this->members->pluck('pivot.user_id')->unique()->join(' ') : null
{
    id: 3,
    title: 'A Title',
    attendees: '1 2 3',
}
...