У меня есть две таблицы в 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, CONSTRAINToccasions_created_by_user_id_foreign
FOREIGN KEY (created_by_user_id
) ССЫЛКИusers
(id
)) (SQL: insert intoupdated_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 () или любой необработанный массив управляемых пользователем входов в метод сохранения или обновления, так как любой столбец, который не защищен, может быть обновлен.