Laravel启动问题-常规错误:1364字段'ID'没有默认值

时间:2019-06-02 20:18:43

标签: php mysql laravel eloquent

我在XAMMP上将Laravel与MySQL一起使用。

我目前正在尝试在users表和profiles表之间建立简单的关系。创建新用户时,我想同时为该特定用户创建一个配置文件。从用户表引用我的uuid“ id”到配置文件表中的“ user_id”。所以我可以在我的应用程序中引用两者。

为此,我在“用户”模型中添加了启动功能。我正在尝试

现在,当我创建一个新用户时,出现以下错误:

  

SQLSTATE [HY000]:常规错误:1364字段“ id”没有默认值   值(SQL:插入usersnameemailpassword,   updated_atcreated_at)值(Jesper Deleuran Larsen,   jesperdeleuranlarsen@gmail.com,   $ 2y $ 10 $ mA4jZINdWhJXfbBihilI0.Lqmn3L5iTs9m7yI / tAuI5FWBVkIdYxu,   2019-06-02 19:56:11,2019-06-02 19:56:11))

如果我删除了User模型中的启动功能,它可以正常工作并生成一个新用户,但个人档案表当然是空的。所以我想错误是在模型中的某个地方,但我似乎无法弄清楚什么是错误的。

由于我是初学者,请告诉我整个设置是否以错误的方式进行。

非常感谢!

我的用户模型

<?php

namespace App;

use App\Mail\NewUserWelcomeMail;
use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Support\Facades\Mail;

class User extends Authenticatable
{
    use Uuids; //UUID
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'id', 'name', 'email', 'password',
    ];
    /**
     * Indicates if the IDs are auto-incrementing.
     *
     * @var bool
     */
    public $incrementing = false;

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    protected static function boot()
    {
        parent::boot();
        static::created(function ($user) {
            $user->profile()->create();
        });
    }


    public function profile()
    {
        return $this->hasOne(Profile::class);
    }
}

我的用户表迁移

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->uuid('id');
            $table->primary('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();

        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
}

我的个人资料表迁移

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateProfilesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('profiles', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->uuid('user_id');
            $table->string('company')->nullable();
            $table->string('phone')->nullable();
            $table->timestamps();

            //Linking profiles table to users table
            $table->index('user_id');
        });




    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('profiles');
    }
}

我的个人资料模型

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Profile extends Model
{

    use Uuids; //UUID

    //Disable fillable
    protected $fillable = [
        'id', 'user_id', 'company', 'phone',
    ];


    public function user()
    {
        return $this->belongsTo(User::class);
    }

}

我创建userids = uuids.php的特征

<?php

namespace App;

use Webpatser\Uuid\Uuid;
use Illuminate\Database\Eloquent\Model;

trait Uuids
{
    /**
     * Boot function from laravel.
     */
    protected static function boot()
    {
        parent::boot();
        static::creating(function ($model) {
            $model->{$model->getKeyName()} = Uuid::generate()->string;
        });


    }

}

3 个答案:

答案 0 :(得分:0)

只是一个猜测而没有看到您的Uuids特性:

您(或软件包维护者)使用boot()方法。它可以工作,但是在模型上定义自己的启动方法时会阻止您使用它。

为解决此类问题,Laravel实现了特征启动方法(see this)。

要使用它,只需将特征的boot()方法重命名为bootUuids(),它应该可以工作!

答案 1 :(得分:0)

更改了我的“ Uuids.php”

发件人:

/batch_classes/:batch_class_id/assignments/:id/edit(.:format).

收件人:

<?php

namespace App;

use Webpatser\Uuid\Uuid;
use Illuminate\Database\Eloquent\Model;

trait Uuids
{
    /**
     * Boot function from laravel.
     */
    protected static function boot()
    {
        parent::boot();
        static::creating(function ($model) {
            $model->{$model->getKeyName()} = Uuid::generate()->string;
        });


    }

}


答案 2 :(得分:-1)

我认为这里要检查的第一件事是您的ID列是否在自动递增。快速浏览一下文档,->uuid()->primary()都没有将列设置为自动奇怪地递增。

如果您实际上并不需要自动递增的字符串(因为您使用的是uuid,则完全可以),我们需要查看您在哪里创建用户,因为您需要传递ID创建时向用户显示。

让我知道检查后是否仍然需要帮助。