0

我正在使用 Laravel 嵌套资源来服务于多对多关系。我正在开发一个足球应用程序,我想将比赛与赛季联系起来,例如英超联赛与 2021/22 赛季。

我想要实现的是有一条专门的路线来管理这种关系,而季节是比赛的子资源。

我的实体在数据库级别有一个自动生成的整数 ID,但我使用getRouteKeyName()将 slug 定义为 Laravel 用于隐式模型绑定的字段。

现在,在比赛下发布新赛季时,我正在努力进行验证。请求如下所示:

POST /api/competitions/premier-league/seasons/

{
    "season": "21-22",
    ...
}

值“21-22”是 Season 对象的实际 slug,但我无法在关联表中使用它进行验证,因为其中的外键使用自动生成的外键,而不是我用于隐式的列模型绑定。

为了澄清,表格如下所示:

seasons                  competition_editions               competitions
id      slug             id      comp    season             id      slug
X       21-22            Z       Y       X                  Y       premier-league

有没有办法让 FormRequest 的唯一规则与模型绑定键一起工作,这样我就不必手动将 slug 转换为控制器内资源的实际 id?

谢谢!

4

1 回答 1

0

所以,我想出了一些东西,但我不确定这是处理它的最好方法。

基本上,我使用prepareForValidation()on FormRequest 将 slug 转换为 Season 资源的实际数据库 ID。

这是代码,只是为了清楚起见:

/**
     * Prepare the data for validation.
     *
     * @return void
     */
    protected function prepareForValidation() {
        $season = Season::where('slug', $this->season)->first();

        $this->merge([
            'season' => $season != null ? $season->id : 0,
        ]);
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules() {
        return [
            'season' => [
                'required',
                'exists:seasons,id',
                Rule::unique('competition_editions', 'season_id')
                    ->where('competition_id', $this->route('competition')->id),
            ],
        ];
    }

我最不喜欢的是将 id 默认为0如果 slug 与任何季节都不匹配,但将其保留为 null 会导致exists规则内出现数据库异常。

于 2022-01-22T21:03:29.103 回答