2015-05-06 5 views
2

У меня есть форма со следующими полями: имя, полное имя, описание, адрес электронной почты, пароль, состояние, город (заполняется через Ajax при выборе состояния) и фотографии (a загрузка изображения). Вот моя схема:Laravel 5: SQLSTATE [23000]: Нарушение ограничения целостности

public function up() 
{ 
    Schema::create('states', function(Blueprint $table) 
    { 
     $table->increments('id'); 
     $table->string('acronym'); 
     $table->string('name'); 
    }); 

    Schema::create('cities', function(Blueprint $table) 
    { 
     $table->increments('id'); 
     $table->string('name'); 
     $table->integer('state_id')->unsigned(); 
     $table->foreign('state_id')->references('id')->on('states'); 
    }); 

    Schema::create('users', function(Blueprint $table) 
    { 
     $table->increments('id'); 
     $table->string('name'); 
     $table->string('fullname'); 
     $table->string('photo'); 
     $table->text('description'); 
     $table->string('email'); 
     $table->string('password', 60); 
     $table->integer('city_id')->unsigned(); 
     $table->foreign('city_id')->references('id')->on('cities'); 
     $table->rememberToken(); 
    }); 
} 

Моя проблема заключается в том, что при нажатии на кнопку отправки, появляется следующее сообщение об ошибке:

SQLSTATE [23000]: нарушение ограничения целостности: 1452 Невозможно добавить или обновить дочернюю строку : ограничение внешнего ключа не удается (. yearbookusers, скованность users_city_id_foreign FOREIGN KEY (city_id) Лит cities (id)) (SQL: вставить в users (name, description, email) значения (Gabriel, описание, [email protected]))

Таким образом, проблема связана с тем, что city_id является внешним ключом (атрибут «значение» из опции в форме - это идентификатор). Fro пример:

<option value="281">Abaíra</option> 

Но когда я пытаюсь вставить через phpmyadmin, он вставляет без ошибок.

И что может быть проблемой?

Вот мой метод экономии на контроллере:

public function saveRegister() 
{ 
    $rules = array(
     'name' => 'required', 
     'description' => 'required', 
     'fullname' => 'required', 
     'email' => 'required', 
     'password' => 'required', 
     'state' => 'required', 
     'city' => 'required', 
     'photo' => 'required', 
     'photo' => 'image|max:3000000', 
    ); 
    $val = \Validator::make(\Input::all(), $rules); 

    if($validar->fails()){ 
     return redirect('register')->withErrors($val); 
    } else { 
     $user = new User(array(
      'name' => \Input::get('name'), 
      'description' => \Input::get('description'), 
      'fullname' => \Input::get('fullname'), 
      'email' => \Input::get('email'), 
      'city_id' => \Input::get('city'), 
     )); 
     $user->timestamps = false; 
     $user->save(); 
     return redirect('register')->with('message', 'User saved!'); 

    } 
} 

Edit: фиксированная CITY_ID на saveRegister() метод.

+1

Вы ' город_ id' в таблице 'users', но в вашем коде вместо этого используется' city'. –

+0

Вы правы, но я исправил и до сих пор получаю ошибку. – Gabriel

ответ

3

вместо

$user = new User(array(
     'name' => \Input::get('name'), 
     'description' => \Input::get('description'), 
     'fullname' => \Input::get('fullname'), 
     'email' => \Input::get('email'), 
     'city' => \Input::get('city'), 
    )); 

сделать это

$user = new User(); 
$user->fill(array(
     'name' => \Input::get('name'), 
     'description' => \Input::get('description'), 
     'email' => \Input::get('email') 
    )); 
$user->fullname = \Input::get('fullname'); 
$user->city= \Input::get('city'); 

или изменить $fillable свойство в модели

+2

Спасибо. Проблема была $ fillable property: у нее не было city_id – Gabriel

+0

Всегда рад помочь! –

+0

Это общая проблема, упуская значение в заполняемом. В моем случае я использую '*' в заполняемом массиве, но с fk мне пришлось поставить '* ',' fk_id ' – dlopezgonzalez

1

Возможно, это связано с тем, что поле city.id не является беззнаковым, тогда как ваши поля FK не имеют знака. Все столбцы, используемые в отношениях, должны точно совпадать.

Попробуйте изменить свой код на этот:

Schema::create('cities', function(Blueprint $table) 
{ 
    $table->increments('id')->unsigned(); 
+0

Я только что попробовал. Это не работает. Я все равно получаю ту же ошибку. – Gabriel

+0

попробуйте вот так: – Ian

+0

'$ table-> unsignedInteger ('id', true);' – Ian

Смежные вопросы