无法通过MassAssignment创建新模型,导致QueryException Duplicate Entry

时间:2015-12-22 07:18:35

标签: php laravel eloquent laravel-5.1

我正在学习Laravel,当我尝试通过artisan tinker插入用户,代码如下

$user = App\User::create([
    'username'=>'johnd',
    'first_name'=>'john',
    'last_name'=>'doe',
    'email'=>'john@doe.com',
    'password'=>'thisShouldBeRandom',
    'shool_id'=>1,'type'=>'TEACHER'
]);

它抛出了这个错误:

Illuminate\Database\QueryException with message 'SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '' for key 'username' (SQL: insert into `users` (`first_name`, `last_name`, `type`, `updated_at`, `created_at`) values (john, doe, TEACHER, 2015-12-22 07:12:49, 2015-12-22 07:12:49))'

我的模特是:

namespace App;

use App\School;
use Illuminate\Auth\Authenticatable;
use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Auth\Access\Authorizable;
use League\Flysystem\Exception;
use URL;

class User extends Model implements AuthenticatableContract,
                                    AuthorizableContract,
                                    CanResetPasswordContract
{
    use Authenticatable, Authorizable, CanResetPassword;

    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table = 'users';

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = ['school_id', 'type'];

    /**
     * The attributes that are NOT mass assignable.
     *
     * @var array
     */
    protected $guarded = ['email', 'password', 'username'];
}

此外,我在错误中注意到它只尝试将以下列插入first_namelast_nametypeupdated_at,{{1}当我在数组中包含created_at时。我失踪了什么?

编辑

看起来我必须添加username以及username, email属性中的其他字段,但我认为这可能会使fillable成为unsecure它可以从请求中填写。我认为这更适合公共数据,例如文章,帖子,评论等。我认为我会采用不同的方法处理敏感数据,但我可能会错。再次感谢所有的帮助!

P.S。使用artisan tinker进行测试时,请确保在修改代码时关闭实例并重新启动,因为它保留了旧的编译实例并且没有看到您的更改。我花了一些时间意识到并引起了很多头痛。

1 个答案:

答案 0 :(得分:4)

您需要从$guarded中移除“用户名”并将其放入$fillable

使用$guarded中的“用户名”,您将阻止设置字段。因此,数据库尝试使用empy默认值创建/更新字段'username',并且您已经有一个空用户名的行(因为相同的错误)。

实际上,从$guarded中删除您需要指定的所有列名,并将它们放在$fillable中,因为我认为您希望创建/更新“电子邮件”和“密码”。< / p>