Afnan Khalifah
Afnan Khalifah

Reputation: 41

Why to I get: Integrity constraint violation: 1452?

I have created many to many relation using a pivot table, I can detach records using ->detach($id) which is fine, but when I try to attach:

$criteria->criterias()->attach($criteria_id);

I get this error:

Next exception 'Illuminate\Database\QueryException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`forge`.`criteria_criteria`, CONSTRAINT `criteria_criteria_criteria_id_foreign` FOREIGN KEY (`criteria_id`) REFERENCES `criterias` (`id`) ON DELETE CASCADE) (SQL: insert into `criteria_criteria` (`central_criteria_id`, `criteria_id`) values (11893, 8647))' in /home/forge/default/vendor/laravel/framework/src/Illuminate/Database/Connection.php:651

My models:

class Criteria extends Model {

    protected $table = 'criterias';
    public $timestamps = true;


    public function criterias()
    {
        return $this->belongsToMany('App\Criteria', 'criteria_criteria', 'central_criteria_id', 'criteria_id');
    }

}

class CriteriaCriteria extends Model {
    protected $table = 'criteria_criteria';
}

And, here is my migrations for them:

class CreateCriteriasTable extends Migration {

    public function up()
    {
        Schema::create('criterias', function(Blueprint $table) {
            $table->increments('id');
            $table->timestamps();
        });
    }


class CreateCriteriaCriteriaPivotTable extends Migration
{

    public function up()
    {
        Schema::create('criteria_criteria', function(Blueprint $table) {
            $table->integer('central_criteria_id')->unsigned()->index();
            $table->foreign('central_criteria_id')->references('id')->on('criterias')->onDelete('cascade');
            $table->integer('criteria_id')->unsigned()->index();
            $table->foreign('criteria_id')->references('id')->on('criterias')->onDelete('cascade');
        });
    }

Any idea how to solve this?

Upvotes: 0

Views: 185

Answers (1)

simo
simo

Reputation: 24600

Try adding ->unsigned()->index(); to your migration like this:

class CreateCriteriasTable extends Migration {

  public function up()
  {
    Schema::create('criterias', function(Blueprint $table) {
        $table->increments('id')->unsigned()->index();
        $table->timestamps();
    });
  }

Upvotes: 1

Related Questions