如何在Laravel中恢复与他的关系的模型?

时间:2019-04-13 21:15:33

标签: laravel eloquent many-to-many relationship

我与数据透视表有ManyToMany关系。在我的模型DeckPlayCard之间,我如何将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 个答案:

答案 0 :(得分:1)

在您显示的代码中,成功响应中的$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())。