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:JSON 字段与数组的比较

mysql 5.7 json类型字段操作

带有 Laravel 的 Postgresql:使用子字符串过滤 Json 字段

Mysql 5.7新特性: JSON字段、虚拟列、视图

带有json类型字段的Laravel数据库在返回值时添加“”

使用mysql innodb 使用5.7的json类型遇到的坑和解决办法