Intereting Posts

Нарушение ограничений целостности: 1452 laravel

У меня есть две таблицы в laravel, созданные со следующими переходами:

Миграция пользователей:

public function up() { Schema::create('users', function($table){ $table->increments('id')->unsigned(); $table->string('email')->unique(); $table->string('password', 64); $table->string('first_name', 32); $table->string('last_name', 32); $table->string('remember_token', 100)->nullable(); }); } 

Миграция событий:

 public function up() { Schema::create('occasions', function($table){ $table->increments('id')->unsigned(); $table->integer('created_by_user_id')->unsigned(); $table->foreign('created_by_user_id')->references('id')->on('users'); $table->integer('updated_by_user_id')->unsigned(); $table->foreign('updated_by_user_id')->references('id')->on('users'); $table->timestamps(); $table->string('title')->unique(); $table->string('slug')->unique(); $table->integer('category')->unsigned(); $table->foreign('category')->references('id')->on('occasion_categories'); $table->string('brand', 32); $table->string('model', 32)->nullable(); $table->string('type', 32)->nullable(); $table->string('body', 32)->nullable(); $table->string('color', 32); $table->integer('fuel')->unsigned()->nullable(); $table->foreign('fuel')->references('id')->on('occasion_fuels'); $table->integer('transmission')->unsigned()->nullable(); $table->foreign('transmission')->references('id')->on('occasion_transmissions'); $table->decimal('usage', 6, 2)->nullable(); $table->integer('engine_capacity')->unsigned()->nullable(); $table->integer('building_year')->unsigned()->nullable(); $table->string('sign', 8)->nullable(); $table->date('mot')->nullable(); $table->integer('kilometers')->nullable(); $table->decimal('price', 8, 2); $table->decimal('action_price', 8, 2)->nullable(); $table->text('description')->nullable(); }); } 

Теперь, когда я пытаюсь создать Случай со следующим кодом:

 Occasion::create(array( 'created_by_user_id'=>Auth::id(), 'updated_by_user_id'=>Auth::id(), 'title'=>Input::get('title'), 'slug'=>Str::slug(Input::get('title')), 'category'=>Input::get('category'), 'brand'=>Input::get('brand'), 'model'=>Input::get('model'), 'type'=>Input::get('type'), 'body'=>Input::get('body'), 'color'=>Input::get('color'), 'fuel'=>Input::get('fuel'), 'transmission'=>Input::get('transmission'), 'usage'=>Input::get('usage'), 'engine_capacity'=>Input::get('engine-capacity'), 'building_year'=>Input::get('building-year'), 'sign'=>Input::get('sign'), 'mot'=>Input::get('mot'), 'kilometers'=>Input::get('kilometers'), 'price'=>Input::get('price'), 'action_price'=>Input::get('action-price'), 'description'=>Input::get('description') )); 

Я получаю следующую ошибку:

SQLSTATE [23000]: Нарушение ограничения целостности: 1452 Невозможно добавить или обновить henw строку: ограничение внешнего ключа завершается с ошибкой ( henw . Timesions, CONSTRAINT occasions_created_by_user_id_foreign FOREIGN KEY ( created_by_user_id ) ССЫЛКИ users ( id )) (SQL: insert into updated_at ( updated_at , created_at ) значения (2014-06-30 18:42:11, 2014-06-30 18:42:11))

Я искал в Google, но большинство людей говорят, что я получаю эту ошибку, потому что внешний ключ не существует, но это не так, потому что, когда я пытаюсь добавить те же значения в PhpMyAdmin, он работает, а идентификатор пользователя, который я есть вставка 1, и она существует.

Ваш последний sql-запрос insert into occasions (updated_at, created_at) values (2014-06-30 18:42:11, 2014-06-30 18:42:11) . Вы должны увидеть, что вставляются только updated_at и created_at .

Это происходит потому, что Laravel по умолчанию защищает ваш код от массового присвоения :

Если пользовательский ввод слепо передается в модель, пользователь может изменять любые атрибуты модели. По этой причине все модели Eloquent по умолчанию защищают от массового присвоения.

Вам нужно будет сделать ваши столбцы заполняемыми, добавив в вашу модель массив столбцов с $fillable :

 class Occasion extends Eloquent { protected $fillable = array( 'created_by_user_id', 'updated_by_user_id', // The rest of the column names that you want it to be mass-assignable. ); } 

Или делайте наоборот, предохраняйте любые столбцы, которые вы не хотите, чтобы они были назначаемыми по массе:

 class Occasion extends Eloquent { protected $guarded = array( // Any columns you don't want to be mass-assignable. // Or just empty array if all is mass-assignable. ); } 

Обратите внимание, что вы напрямую назначаете Input::get() в модель. Вот предосторожность из раздела Mass Assignment :

Примечание. При использовании защищенных вы никогда не должны передавать Input :: get () или любой необработанный массив управляемых пользователем входов в метод сохранения или обновления, так как любой столбец, который не защищен, может быть обновлен.