Reputation: 41
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
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