Как вернуть модель с его отношениями в Laravel? - PullRequest
0 голосов
/ 14 апреля 2019

У меня есть отношение ManyToMany с сводной таблицей.Между моей моделью Deck и PlayCard как я могу вернуть свою колоду с его Playcard внутри?

Примерно так:

id: 1,
...
play_cards: [
    {
        id: 1, ...
    },
    {
        id: 2, ...
    }
]

Я пытался использовать with()функция, но она не работает.

Это моя функция:

public function addToDeck(Request $request)
{
    $play_card = Auth::user()->playCards()->where('uid', $request->card_uid)->first();
    $deck = Auth::user()->decks()->where('token', $request->deck_token)->first();

    if (!$play_card || !$deck) {
        return ResponseService::respondWithErrors(
            400,
            $this->routes_messages[__FUNCTION__],
            ['Error Deck or Uid unknow.']
        );
    }

    if ($play_card->decks()->find($deck->id)) {
        return ResponseService::respondWithErrors(
            400,
            $this->routes_messages[__FUNCTION__],
            ['Card already in this deck.']
        );
    }

    $deck->playCards()->attach($play_card);
    $deck->save();

    return ResponseService::respondOK(
        200,
        $this->routes_messages[__FUNCTION__],
        $deck
    );
}

1 Ответ

1 голос
/ 14 апреля 2019

В коде, который вы показали, $deck в успешном ответе не будет отображать связанных карточек, потому что вы никогда не загружали отношения в колоду.Вы обратились к запросу о взаимосвязи, чтобы добавить новую карточку, но на самом деле вы никогда не выполняли запрос, чтобы получить карточки для колоды.

Однако использование with для загрузки исходных карточек тоже вам мало поможет.,В ваш ответ войдут оригинальные карточки, но не будет добавлена ​​новая.Изменение связанных записей не влияет на записи, которые уже загружены.

В этом случае, после того, как вы прикрепите новую карту к связанным картам колоды, вам потребуется перезагрузить отношения, чтобы карта отображалась вответ.

// Add the card to the deck.
$deck->playCards()->attach($play_card);

// Load (or reload) the new set of related playcards. This will populate
// the $deck->playCards attribute so it will show up in your response.
$deck->load('playCards');

В примечании к стороне нет причин сохранять $deck.Вы ничего не изменили на этом.Если вы пытаетесь обновить временную метку updated_at на деке, это все равно не сработает, поскольку фактически не обновит поля, если модель не загрязнена.Однако, если это ваша цель, вы можете использовать метод touch() ($deck->touch()).

...