У меня есть форма со следующими полями: имя, полное имя, описание, адрес электронной почты, пароль, штат, город (заполняется через 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 protected]))
Таким образом, проблема связана с тем, что 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 ().
вместо
$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
свойство в модели
Это может быть из-за того, что ваше поле towns.id не подписано, а поля FK не подписаны. Все столбцы, используемые в отношениях, должны точно совпадать.
Попробуйте изменить свой код на это:
Schema::create('cities', function(Blueprint $table)
{
$table->increments('id')->unsigned();