【问题标题】:Illuminate\Database\QueryException : SQLSTATE[HY000]: General error: 1364 Field 'user_id' doesn't have a default value (SQL: insert into `users`Illuminate\Database\QueryException:SQLSTATE[HY000]:一般错误:1364 字段 'user_id' 没有默认值(SQL:插入到 `users`
【发布时间】:2020-04-14 23:41:50
【问题描述】:

我有一个问题,而我得到的答案并没有真正帮助我。

所以我一直在尝试基本上为每个用户创建一个 Profiles 表。我遵循了一对一关系的规则,但我不断收到此错误

Illuminate\Database\QueryException : SQLSTATE[HY000]: 一般错误: 1364 Field 'user_id' doesn't have a default value (SQL: insert into users (name, email, password, admin, updated_at, created_at) 值 (Darlington Okorie, darlingtonokoriec@gmail.com, $2y$10$Ob161LW8sbbv5uDv9VVbienlmW.DWXVDK3wdfC0I0NlnOrg1Jx/a2, 1, 2019-102-23: 2019-102-23: 23 17:41:30))

这是我在UsersTableSeeder 中写的代码

public function run()
{

 $user = App\User::create([
        'name' => 'Darlington Okorie',
        'email' => 'darlingtonokoriec@gmail.com',
        'password' => bcrypt('password'),
        'admin' => 1
    ]);

    App/Profile::create([
        'user_id' =>  $user->id,
        'avatar' => 'uploads/avatar/img.png',
        'about' => 'Great at writing. Better at blogging',
        'facebook' => 'facebook.com',
        'youtube' => 'youtube.com'
    ]);
}

我还在我的create_users_table 中定义了user_id

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        Schema::dropIfExists('users');
        $table->bigIncrements('id');
        $table->string('name');
        $table->string('user_id');
        $table->string('email')->unique();
        $table->boolean('admin')->default(0);
        $table->timestamp('email_verified_at')->nullable();
        $table->string('password');
        $table->rememberToken();
        $table->timestamps();
    });
}

并在我的create_profiles_table 中定义了user_id

 public function up()
{
    Schema::create('profiles', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('avatar');
        $table->integer('user_id');
        $table->text('about');
        $table->string('facebook');
        $table->string('youtube');

        $table->timestamps();
    });
}

可能出了什么问题?

【问题讨论】:

  • App/Profile 是错字还是复制/粘贴问题?应该是App\Profile(斜线方向错误)。
  • 你能分享你的User模型吗?
  • 刚刚注意到。将检查并确认。谢谢。

标签: php laravel


【解决方案1】:

我也遇到过这种问题。 我的情况,我忘了在fillable 中写字段。

protected $fillable = [
        'name', 
    ];

在 $fillable 中写入字段后。我的问题已解决。

【讨论】:

    【解决方案2】:

    您可以设置 'user_id' 以允许来自 db 的 null。

    【讨论】:

    • 建议更改数据库定义确实应该附带一些解释这样做可能产生的影响。另外请不要将常规文本格式化为代码。
    【解决方案3】:

    一般错误:1364 字段 'user_id' 没有默认值

    这个错误的意思是你在表中有一个你没有通过的列

    表单中的值...在您的情况下,您没有为字段传递值

    user_id.我猜你想要实现的是你想给主要的

    key a name.so 修复应该是重命名列 $table->bigIncrements('id');到

    $table->bigIncrements('user_id');并删除 $table->string('user_id');

    【讨论】:

      【解决方案4】:

      我不知道你们的关系是如何建立的,但请尝试如下所述进行一些更改。从用户表中删除 use_id。你不需要那个专栏。或者只需将其重命名为 USER_CODE 例如,如果它不是必填列$table->string('user_id')->nullable();,则使其可为空 老实说,我看不到在 usrs 表中包含 user_id 列的目的

      // Profiles Migration:    
      
      public function up()
      {
      Schema::create('profiles', function (Blueprint $table) {
          ...
          $table->unsignedInteger('user_id');
           ....
         $table->foreign('user_id')->references('id')->on('users')
                  ->onUpdate('cascade')->onDelete('cascade');
        });
      }
      
      // Profile.php Model
      public function user()  
      
      {
        return $this->belongsTo('App\User');
      }
      
      // User.php Model
      public function user()
        {
            return $this->hasOne('App\Profile');
        }
      
      // Inside your Controller
      
         $user = new App\User;
         $user->name = 'Darlington Okorie';
         $user->email = 'darlingtonokoriec@gmail.com';
         $user->password = bcrypt('password');
         $user->admin => 1;
         if($user->save()) {
      
           $userID = $user->id;
      
           $profile = new App/Profile;
           $profile->user_id =  $userID;
           $profile->avatar = 'uploads/avatar/img.png';
           $profile->about = 'Great at writing. Better at blogging';
           $profile->facebook = 'facebook.com';
           $profile->youtube = 'youtube.com';
           $profile->save();
          }
      

      【讨论】:

        【解决方案5】:

        只需从users 表中删除$table->string('user_id');。您在profiles 表上有user_id,这足以实现user -> profile 一对一的关系。

        注意:最好在profiles 表上使用$table->unsignedBigInteger('user_id'); 而不是当前的$table->integer('user_id');

        【讨论】:

          【解决方案6】:

          这是您的 users 迁移问题,而不是 profiles 迁移问题。您的迁移有这一行:

          Schema::create('users', function (Blueprint $table) {
            ...
            $table->string('user_id'); // This one
          

          这将创建一个名为 user_id 的非空 varchar 列。在您的 Seed 文件中,您没有设置,并且不允许使用 null。在下面添加并配置以下行:

           $user = App\User::create([
            'name' => 'Darlington Okorie',
            'email' => 'darlingtonokoriec@gmail.com',
            'password' => bcrypt('password'),
            'admin' => 1,
            'user_id' => 'SomeRandomString' // Add this, set to whatever is logical.
          ]);
          

          或者,在您的 users 迁移上设置 nullable()

          Schema::create('users', function (Blueprint $table) {
            $table->string('user_id')->nullable();
          

          老实说,除非您需要为每个 User 提供单独的标识符,否则您的 users 表可能不需要 user_id,您可以将其从迁移中完全删除。

          编辑:我真的不确定谁投了反对票,但请阅读错误消息:

          字段 'user_id' 没有默认值(SQL:插入 users ...)

          遇到此错误时,查询尝试插入 users 表,而不是 profiles 表。由于users.user_id 没有默认值,也不允许null,因此会引发错误。上面的 3 个替代方案提供了一个解决方案。

          该错误与UserProfile 模型无关,因为迁移本身存在问题。

          【讨论】:

            猜你喜欢
            • 2019-01-05
            • 2019-03-24
            • 1970-01-01
            • 2017-11-10
            • 2020-05-25
            • 2021-03-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多