it-roy-ru.com

SQLSTATE [23000]: Нарушение ограничения целостности: 1452 Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется - Laravel

Я знаю, что этот вопрос уже задавался, но я все еще не могу найти то, что я делаю неправильно.

Я использую фреймворк Laravel.

У меня есть 2 таблицы (пользователи и местоположения). Когда я хочу создать пользователя, я получаю сообщение об ошибке:

SQLSTATE [23000]: Нарушение ограничения целостности: 1452 Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполнено (. festival_aid.users, скованность fk_users_locations1 FOREIGN KEY .__ (location_id) ЛИТЕРАТУРЫ locations (location_id) ON DELETE CASCADE .__ ON UPDATE NO ACTION.) (SQL:. Вставить в users (user_id .__ user_email, location_id) значения (? ,?,?)) (Привязки: массив (0 => '1', 1 => '[email protected]', 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();
    }

Я не могу понять, что я делаю неправильно. Очевидно, что что-то не так с внешним ключом. 

7
Gilko

Пользовательской строке нужна ссылка на действительное местоположение. Это местоположение должно быть доступно до сохранения пользователя. Итак, сначала сохраните местоположение, а затем сохраните пользователя и раскомментируйте строку $user->location_id, и все готово. 

11
Haneev

Те разработчики, которые сталкиваются с этой ошибкой:

SQLSTATE [23000]: Нарушение ограничения целостности: 1452 Невозможно добавить или обновить дочернюю строку:
сбой ограничения внешнего ключа (laravel.articles, CONSTRAINT articles_user_id_foreign FOREIGN KEY (user_id) ССЫЛКИ users (id) ON DELETE CASCADE)
(SQL: вставить в значения articles (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, CONSTRAINT articles_user_id_foreign FOREIGN KEY (user_id) ССЫЛКИ users (id) ON DELETE CASCADE)
(SQL: вставить в значения articles (title, user_id, body, updated_at, created_at) (rao, 1, sflkkjk, 2016-03-01 20:45:32, 2016-03-01 20:45:32))

Сначала сохраните пользовательскую запись пользователя, затем попробуйте вставить запись, а затем легко вставить в базу данных.

КЛЮЧЕВОЙ МОМЕНТ

Две таблицы: одна - статья, другая - пользовательская. У пользователя есть много статей, но ни одна статья не имеет много пользователей. Таким образом, внешний ключ смещен в сторону таблицы статей. Если в пользовательской таблице нет записей, вы сталкиваетесь с той же ошибкой, что и ранее.

Делая это, мы можем легко решить эту проблему.

0
user4556117