如何在 mysql (laravel) 中使 varchar 可以为空且唯一

Nat*_*ngh 9 php mysql schema laravel

我可以将 MySQL 列设为可空且唯一吗?如果用户想提供,我有一个存储用户 Email_id 的表,否则它将是(空)。我在其他一些问题中读到,我可以使用默认的 NULL 创建一个唯一的字段。但我在创建表时收到此错误

#1067 - Invalid default value for 'email' (i make it only for test purpose)
Run Code Online (Sandbox Code Playgroud)

主表是用 laave 模式构建器类生成的

$table->text('email')->nullable()->unique(); (no default added)
Run Code Online (Sandbox Code Playgroud)

在数据库中

+--------------+------------------+------+-----+---------+----------------+
| Field        | Type             | Null | Key | Default | Extra          |
+--------------+------------------+------+-----+---------+----------------+ 
| email_id     | varchar(200)     | YES  | UNI | NULL    |                |
Run Code Online (Sandbox Code Playgroud)

现在错误是

Duplicate entry '' for key 'users_email_id_unique' (when inserting email with empty string) 
Run Code Online (Sandbox Code Playgroud)

现在的问题是如何处理一个唯一且可以为空的 varchar 字段。

Das*_*sun 9

我知道这是一个老问题,这是为其他有同样问题的人准备的。

您正在尝试添加一个字符串。您将列设为 nullableunique。这意味着您正在尝试不应该做的事情。您可以发送多个值,但不能发送多个字符串。MySQL 将视为一个值。

或者你可以在你的模态中写一个mutator

public function setEmailAttribute($value) {
    if ( empty($value) ) { // will check for empty string
    $this->attributes['email'] = NULL;
    } else {
        $this->attributes['email'] = $value;
    }
}
Run Code Online (Sandbox Code Playgroud)