【发布时间】:2021-04-20 17:56:26
【问题描述】:
我遇到了一个问题,我的 UserCountries API 控制器中的 store 方法返回的数据似乎落后了一步,我不知道为什么。我的应用程序有两个模型:Country 和 User,它们与数据透视表具有多对多关系。在我的应用中,特定用户应该能够“喜欢”和“不喜欢”一个国家/地区。
这主要按预期工作,但是我的问题是每个请求返回的数据落后了一步 - 例如,如果我发送 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 控制器中的存储方法如下:
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]));
}
如果我可以添加任何其他内容以使其更有帮助,请告诉我!
【问题讨论】: