Laravel store()方法从api控制器没有返回更新的数据



我遇到了一个问题,我的UserCountries API控制器中的存储方法返回的数据似乎落后一步,我不知道为什么。我的应用程序有两个模型:CountryUser,它们与数据透视表有多对多关系。在我的应用程序中,特定的用户应该能够"喜欢"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))

最新更新