php Laravel 5:违反完整性约束:1452无法添加或更新子行:外键约束失败

guicsvcw  于 2023-04-19  发布在  PHP
关注(0)|答案(6)|浏览(148)

我有一个简单的文章模型和一个用户模型。
文章“belongsTo”用户和用户“hasMany”文章。
因此,我的文章迁移有一个名为“user_id”的外键。

Schema::create('articles', function(Blueprint $table) {
        $table->increments('id');
        $table->string('title');
        $table->text('body');
        $table->integer('user_id')->unsigned();
        $table->foreign('user_id')->references('id')->on('users');
        $table->timestamps();
    });

然而,每当我创建一个文章,我通过“用户_id”在一个隐藏的领域,我得到一个错误消息。

{!! Form::open(array('route' => 'articles.store')) !!}

    {!! Form::hidden('userId', $user->id) !!}

    <div class="form-group">
        {!! Form::label('title', 'Title') !!}
        {!! Form::text('title', null, array('class' => 'form-control')) !!}         
    </div>

    <div class="form-group">
        {!! Form::label('text', 'Write your Article') !!}
        {!! Form::textarea('text', null, array('class' => 'form-control')) !!}          
    </div>

    {!! Form::submit('Create Article', array('class' => 'btn btn-default btn-success')) !!}
{!! Form::close() !!}

这是错误消息。我明白我没有尝试将'user_id'的值插入到articles表中。
SQLSTATE[23000]:违反完整性约束:1452无法添加或更新子行:外键约束失败(tags. articles,CONSTRAINT articles_user_id_foreign FOREIGN KEY(user_id)REFERENCES usersid))(SQL:insert into articlestitlebodyupdated_atcreated_at)values(Title,Some text,2015 -03-21 23:19:33,2015-03-21 23:19:33))
下面是我在AriclesController上的Store方法:

Article::create([
        'title'   => Input::get('title'),
        'body'    => Input::get('text'),
        'user_id' => Input::get('userId')
    ]);

    return Redirect::to('articles');

还有几十个其他开放的Stackoverflow问题具有类似的标题,我正在寻找适合我的特定情况的答案,但没有成功,因此我提前感谢你善良的陌生人。
如何将文章保存到数据库中?

wz8daaqr

wz8daaqr1#

确保您的Article模型的fillable属性中有user_id
http://laravel.com/docs/5.0/eloquent#mass-assignment

6ioyuze2

6ioyuze22#

我也遇到了同样的问题。我向一个已经存在并且有数据的表添加了一个外键,但是我无法运行迁移,因为它一直失败。使迁移工作正常的解决方案是使外键可为空。

$table->integer('user_id')->nullable()->unsigned();

// then the foreign key
$table->foreign('user_id')->references('id')->on('users');

希望将来能节省别人的时间。

xqnpmsa8

xqnpmsa83#

我在为现有表运行迁移时遇到过几次这个错误。原因如下:
1.'user_id'和users 'id'的类型是不同的。例如,当'user_id'是INT而users 'id'是BIGINT时。
1.列“user_id”不为空,您需要将其设置为可空
1.列“user_id”中的值在用户“id”中不存在

tktrz96b

tktrz96b4#

对我来说,工作是通过添加nullable()也与Laravel 7+,你可以做foreignId,所以为您的情况
$table->foreignId('user_id')->nullable()->constrained()->cascadeOnDelete();
对于回滚$table->dropForeign(['user_id']);$table->dropColumn('user_id');
此外,如果数据存在,我们不希望在生产环境中将其拉下,因此您可以禁用外键约束

Schema::disableForeignKeyConstraints();
Schema::table('articles', function (Blueprint $table) {
  $table->foreign('user_id')
   ->references('id')->on('users')
   ->onDelete('cascade');
  });
 Schema::enableForeignKeyConstraints();
qaxu7uf2

qaxu7uf25#

我遇到了这个问题,因为我正在使用现有数据更新现有表,因此添加外键会导致问题,因为没有默认的外键分配给条目。我通过首先从表中删除数据,然后重新运行迁移来解决这个问题

tmb3ates

tmb3ates6#

在我的情况下(laravel 7)需要在创建列时添加nullable,并且在创建外部时添加-〉nullable()-〉constrained()-〉cascadeOnDelete(),此外它还包括DB事务,因为在错误发生之前正在创建新表,并且我总是需要在运行迁移之前删除它

<?php

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

class CreateUnidadePesoTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        try{
            DB::beginTransaction();
            Schema::create('unidades_peso', function (Blueprint $table) {
                $table->id();
                $table->string('unidade',3);
                $table->string('descricao',20);
                $table->timestamps();
            });

            //relacionamento com a tabela produto 1 para muitos
            Schema::table('produtos', function (Blueprint $table){
                $table->unsignedBigInteger('unidade_peso_id')->nullable();
                $table->foreign('unidade_peso_id')->references('id')->on('unidades_peso')->nullable()->constrained()->cascadeOnDelete();
            });
                
            //relacionamento com a tabela produto_detalhes 1 para muitos
            Schema::table('produto_detalhes', function (Blueprint $table){
                $table->unsignedBigInteger('unidade_peso_id')->nullable();
                $table->foreign('unidade_peso_id')->references('id')->on('unidades_peso')->nullable()->constrained()->cascadeOnDelete();
            });
            DB::commit();
        }catch (Exception $e){
            DB::rollBack();
        }
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        try{
            DB::beginTransaction();
            //--remover relacionamento com produto_detalhes
            Schema::table('produto_detalhes', function (Blueprint $table){
                // remover a fk primeiro
                $table->dropForeign('produto_detalhes_unidade_peso_id_foreign');// [table]_[coluna]_[foreign]
                //remover a coluna unidade_id
                $table->dropColumn('unidade_peso_id');
                
            });

            

            //--remover relacionamento com produtos
            Schema::table('produtos', function (Blueprint $table){
                // remover a fk primeiro
                $table->dropForeign('produtos_unidade_peso_id_foreign');// [table]_[coluna]_[foreign]
                //remover a coluna unidade_id
                $table->dropColumn('unidade_peso_id');
                
            });

            Schema::dropIfExists('unidades_peso');
            DB::commit();
        }catch(Exception $e){
            DB::rollBack();
        }
    }
}

相关问题