Laravel 5.7 具有 JSON 字段类型的存在/唯一验证
Posted
技术标签:
【中文标题】Laravel 5.7 具有 JSON 字段类型的存在/唯一验证【英文标题】:Laravel 5.7 exists/unique validation with JSON field type 【发布时间】:2019-03-29 01:05:01 【问题描述】:我有一个包含以下字段的“国家”表:
id: integer
name: json
字段“名称”将值存储为:
"en": "Germany", "de": "Deutschland"
我写了以下规则:
'country' => 'nullable|string|max:255|exists:countries,name->en'
但它不是那样工作的。如何让它发挥作用?
MariaDB 10.1.36 / Laravel 5.7
【问题讨论】:
有错误吗?你使用的是什么数据库和版本的 Laravel? 我添加了信息。谢谢。 Laravel 不支持 MariaDB 上的 JSON 查询。这将在 Laravel 5.8 中修复。 同时,你可以使用这个包:github.com/ybr-nx/laravel-mariadb 我将 MariaDB 升级到 10.3.9 并安装了软件包 laravel-mariadb。现在一切都像魅力一样工作。如果你愿意,你可以发布你之前的两个 cmets 作为答案,我会接受的。谢谢。 【参考方案1】:我认为使用 laravel 的默认验证规则是不可能的。 您必须将 where 子句添加到 exists 规则或为此创建自己的 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);
)
],
];
【讨论】:
【参考方案2】:Laravel 5.7 不支持 MariaDB 上的 JSON 查询。这将在 Laravel 5.8 中修复。
同时,你可以使用这个包:https://github.com/ybr-nx/laravel-mariadb
【讨论】:
以上是关于Laravel 5.7 具有 JSON 字段类型的存在/唯一验证的主要内容,如果未能解决你的问题,请参考以下文章
带有 Laravel 的 Postgresql:使用子字符串过滤 Json 字段