Laravel 5: SQLSTATE [23000]: нарушение ограничения целостности

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

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 Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполнено (yearbook,users, ОГРАНИЧЕНИЕ users_city_id_foreign ИНОСТРАННЫЙ КЛЮЧ (city_id) РЕКОМЕНДАЦИИ cities (id)) (SQL: вставить в users (name, description, email) значения (Габриэль, Описание, email@gmail.com))

Таким образом, проблема связана с тем, что city_id является внешним ключом (атрибут ‘value’ из опции в форме — это id). Для примера:

<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!');

}
}

Редактировать: исправлен city_id в методе saveRegister ().

2

Решение

вместо

$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 свойство в модели

3

Другие решения

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

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector