Я знаю, что этот вопрос уже задан, но я все еще не могу найти то, что я делаю неправильно.
Я использую фреймворк Laravel.
У меня есть 2 таблицы (пользователи и местоположения). Когда я хочу создать пользователя, я получаю сообщение об ошибке:
SQLSTATE [23000]: Нарушение ограничения целостности: 1452 Невозможно добавить или обновить дочернюю строку: сбой ограничения внешнего ключа (
festival_aid
. Users, CONSTRAINTfk_users_locations1
ИНОСТРАННЫЙ КЛЮЧ (location_id
) ЛИТЕРАТУРАlocations
(location_id
) ВКЛ УДАЛИТЬ КАСКАД В ОБНОВИВЕНИИ НЕТ ДЕЙСТВИЙ) (SQL : вставить вusers
(user_id
,user_email
,location_id
) значения (?,?,?)) (Привязки: array (0 => '1', 1 => 'test@hotmail.com', 2 => '1', ))
Пользователи таблицы
CREATE TABLE IF NOT EXISTS `festival_aid`.`users` ( `user_id` BIGINT NOT NULL AUTO_INCREMENT, `user_email` VARCHAR(45) NOT NULL, `user_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, `user_modified` TIMESTAMP NULL, `user_deleted` TIMESTAMP NULL, `user_lastlogin` TIMESTAMP NULL, `user_locked` TIMESTAMP NULL, `location_id` BIGINT NOT NULL, PRIMARY KEY (`user_id`), UNIQUE INDEX `user_email_UNIQUE` (`user_email` ASC), CONSTRAINT `fk_users_locations1` FOREIGN KEY (`location_id`) REFERENCES `festival_aid`.`locations` (`location_id`) ON DELETE CASCADE ON UPDATE NO ACTION, ENGINE = InnoDB;
Расположение таблиц
DROP TABLE IF EXISTS `festival_aid`.`locations` ; CREATE TABLE IF NOT EXISTS `festival_aid`.`locations` ( `location_id` BIGINT NOT NULL AUTO_INCREMENT, `location_latitude` FLOAT NOT NULL, `location_longitude` FLOAT NOT NULL, `location_desc` VARCHAR(255) NULL, `location_type` VARCHAR(45) NULL, PRIMARY KEY (`location_id`)) ENGINE = InnoDB;
Пользователь миграции
public function up() { Schema::table('users', function(Blueprint $table) { $table->increments('user_id'); $table->string('user_email'); $table->timestamp('user_created'); $table->timestamp('user_modified'); $table->timestamp('user_deleted'); $table->timestamp('user_lastlogin'); $table->timestamp('user_locked'); $table->foreign('location_id') ->references('id')->on('locations'); //->onDelete('cascade'); }); }
Место миграции
public function up() { Schema::table('locations', function(Blueprint $table) { $table->primary('location_id'); $table->float('location_latitude'); $table->float('location_longitude'); $table->string('location_desc'); $table->string('location_type'); }); }
Пользователь модели
public function location() { return $this->belongsTo('Location'); }
Расположение модели
public function user() { return $this->hasOne('User'); }
контроллер
public function store() { $input = Input::all(); $rules = array('user_email' => 'required|unique:users|email'); $v = Validator::make($input, $rules); if($v->passes()) { $user = new User(); $location = new Location(); $user->user_email = $input['user_email']; //$user->location_id = $input['location_id']; $location->location_latitude = $input['location_latitude']; $location->location_longitude = $input['location_longitude']; $user->save(); $location->save(); }
Я не могу найти, что я делаю неправильно. Очевидно, что с внешним ключом что-то не так.
Строка пользователя требует ссылки на допустимое местоположение. Это местоположение должно быть доступно до того, как пользователь будет сохранен. Итак, сначала сохраните местоположение, а затем сохраните пользователя и раскомментируйте строку $user->location_id
и все готово.
Те разработчики, которые сталкиваются с этой ошибкой:
SQLSTATE [23000]: Нарушение ограничения целостности: 1452 Невозможно добавить или обновить дочернюю строку:
Ограничение внешнего ключа завершается неудачно (laravel
.articles
, CONSTRAINTarticles_user_id_foreign
FOREIGN KEY (user_id
) ССЫЛКИusers
(id
) ON DELETE CASCADE)
(SQL: insert intoarticles
(title
,user_id
,body
,updated_at
,created_at
) значения (rao, 1, sflkkjk, 2016-03-01 20:45:32, 2016-03-01 20:45:32))
SQLSTATE [23000]: Нарушение ограничения целостности: 1452 Невозможно добавить или обновить дочернюю строку:
Ограничение внешнего ключа завершается неудачно (laravel
.articles
, CONSTRAINTarticles_user_id_foreign
FOREIGN KEY (user_id
) ССЫЛКИusers
(id
) ON DELETE CASCADE)
(SQL: insert intoarticles
(title
,user_id
,body
,updated_at
,created_at
) значения (rao, 1, sflkkjk, 2016-03-01 20:45:32, 2016-03-01 20:45:32))
Сначала Сохраните запись пользователя пользователя, затем попытайтесь вставить запись, а затем легко вставить в базу данных.
КЛЮЧЕВОЙ МОМЕНТ
Две таблицы: одна статья, а другая – пользователь. У пользователя много статей, но ни одна статья не имеет много пользователей. Таким образом, внешний ключ смещается в сторону таблицы статей. Если таблица пользователя не имеет записи, вы сталкиваетесь с той же ошибкой, что и раньше.
Делая это, мы можем легко решить эту проблему.