Laravel 5.7 exists/unique 使用 JSON 字段类型进行验证

Laravel 5.7 exists/unique validation with JSON field type

我有一个 "countries" table,其中包含以下字段:

id: integer
name: json

字段 "name" 将值存储为:

{ "en": "Germany", "de": "Deutschland" }

我写了以下规则:

'country' => 'nullable|string|max:255|exists:countries,name->en'

但事实并非如此。我如何让它发挥作用?

MariaDB 10.1.36 / Laravel 5.7

我认为 laravel 的默认验证规则不可能做到这一点。 您必须向现有规则添加一个 where 子句或为此创建您自己的 custom validation 规则:

使用 where 子句:

public function rules()
{
    $country = $this->country;

    return [
        'country' => [
            'nullable',
            'string',
            'max:255',
            Rule::exists('countries')->where(function ($query) use ($country) {
                return $query->where(DB::raw('JSON_EXTRACT(`name`, "$.en")'), $country);
            })
        ],
    ];
}

Laravel 5.7 不支持 MariaDB 上的 JSON 查询。这将在 Laravel 5.8.

中修复

同时,您可以使用这个包:https://github.com/ybr-nx/laravel-mariadb