【问题标题】:Laravel store() method from api controller not returning updated data来自 api 控制器的 Laravel store() 方法不返回更新的数据
【发布时间】:2021-04-20 17:56:26
【问题描述】:

我遇到了一个问题,我的 UserCountries API 控制器中的 store 方法返回的数据似乎落后了一步,我不知道为什么。我的应用程序有两个模型:CountryUser,它们与数据透视表具有多对多关系。在我的应用中,特定用户应该能够“喜欢”和“不喜欢”一个国家/地区。

这主要按预期工作,但是我的问题是每个请求返回的数据落后了一步 - 例如,如果我发送 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]));
    }

如果我可以添加任何其他内容以使其更有帮助,请告诉我!

【问题讨论】:

    标签: php laravel api


    【解决方案1】:

    您在添加/删除任何相关记录之前加载关系。加载的关系 Collection 将不包括这些更改。您需要重新加载关系以获取新的相关记录列表。

    我不知道您的其余代码,但如果是这种情况,您会添加这样的调用:

    $user->load('countries');
    

    这是加载关系(如果尚未加载):

    if($this->countries->contains($country))
    

    【讨论】:

    • 太棒了,我将$user->load('countries'); 添加到我的store() 方法中,这似乎已经解决了!非常感谢
    猜你喜欢
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    相关资源
    最近更新 更多