繁体   English   中英

Laravel store() 方法来自 api controller 不返回更新的数据

[英]Laravel store() method from api controller not returning updated data

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

这主要按预期工作,但是我的问题是每个请求返回的数据都落后了一步 - 例如,如果我发送一个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 controller 中的索引方法如下:

    public function index()
    {
        return CountryResource::collection(auth()->user()->countries);
    }

我在 UserCountries controller 中的存储方法如下:

    public function store(UserCountriesRequest $request)
    {
        $user = auth()->user();
        $user->setCountries($request->get("countries"));
        return new UserCountriesResource($user);
    }

store 方法调用 User model 中的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 model 中的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 将不包括这些更改。 您将需要重新加载关系以获取相关记录的新列表。

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

$user->load('countries');

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM