我遇到了一个问题,我的UserCountries
API控制器中的存储方法返回的数据似乎落后一步,我不知道为什么。我的应用程序有两个模型:Country
和User
,它们与数据透视表有多对多关系。在我的应用程序中,特定的用户应该能够"喜欢"one_answers"不喜欢"一个国家。
这主要是按预期工作,但我的问题是,每个请求上返回的数据是落后一步-例如,如果我发送一个POST
请求喜欢一个特定的国家,我得到一个200
响应,但我返回一个UserCountriesResource
,其中不包括应该刚刚添加的国家。如果我然后立即发送一个GET
请求,它返回一个UserCountriesResource
,其中不包含该国家。有人能告诉我为什么吗?
这是我的路线:
Route::group(["prefix" => "me/countries"], function(){
Route::get("", [UserCountries::class, "index"]); // see all countries liked by user
Route::post("", [UserCountries::class, "store"]); // add or remove country from user
});
我在UserCountries控制器中的索引方法如下:
public function index()
{
return CountryResource::collection(auth()->user()->countries);
}
我在UserCountries控制器中的store方法如下:
public function store(UserCountriesRequest $request)
{
$user = auth()->user();
$user->setCountries($request->get("countries"));
return new UserCountriesResource($user);
}
store方法调用User模型中的setCountries
方法:
public function setCountries(array $strings) : User
{
$countries = Country::fromStrings($strings);
$countries->map(function($country) use($countries){
if($this->countries->contains($country)){
Country::find($country->id)->users()->detach($this->id);
} else {
$this->countries()->syncWithoutDetaching($country->id);
}
});
return $this;
}
上面的setCountries方法依次调用Country模型中的fromStrings
方法:
public static function fromStrings(array $strings) : Collection
{
return collect($strings)->map(fn($str) => trim($str))
->unique()
->map(fn($str) => Country::firstOrCreate(["NAME"=>$str]));
}
请让我知道,如果有什么我可以添加,使这更有帮助!
在添加/删除任何相关记录之前,您正在加载关系。加载的关系Collection将不包括这些更改。您将需要重新加载关系以获得相关记录的新列表。
我不知道你剩下的代码,但你会添加一个这样的调用,如果是这样的话:
$user->load('countries');
加载关系(如果还没有加载的话):
if($this->countries->contains($country))