我与数据透视表有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
);
}
答案 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()
)。