Je sais que cette question a déjà été posée, mais je ne trouve toujours pas ce que je fais mal.
J'utilise le framework Laravel.
J'ai 2 tables (utilisateurs et emplacements). Lorsque je veux créer un utilisateur, je reçois le message d'erreur suivant:
SQLSTATE [23000]: Violation de contrainte d'intégrité: 1452 Impossible d'ajouter ou de Mettre à jour une ligne enfant: échec d'une contrainte de clé étrangère (
festival_aid
.users
, CONSTRAINTfk_users_locations1
. FOREIGN KEY (location_id
) RÉFÉRENCESlocations
(location_id
) ON DELETE CASCADE ON UPDATE NO ACTION) (SQL: insérer dansusers
(user_id
,user_email
,location_id
) valeurs (?,?,?)) (Liaisons: array ( 0 => '1', 1 => '[email protected]', 2 => '1',))
Utilisateurs de la table
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;
Emplacement des tables
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;
Utilisateur de migration
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');
});
}
Lieu de migration
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');
});
}
Modèle utilisateur
public function location()
{
return $this->belongsTo('Location');
}
Emplacement du modèle
public function user()
{
return $this->hasOne('User');
}
Manette
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();
}
Je n'arrive pas à trouver ce que je fais mal. De toute évidence, il y a un problème avec la clé étrangère.
Une ligne utilisateur nécessite une référence à un emplacement valide. Cet emplacement doit être disponible avant que l'utilisateur ne soit enregistré. Donc, enregistrez d'abord l'emplacement, puis enregistrez l'utilisateur, décommentez la ligne $user->location_id
et vous avez terminé.
Les développeurs qui font face à cette erreur:
SQLSTATE [23000]: Violation de contrainte d'intégrité: 1452 Impossible d'ajouter ou de mettre à jour une ligne enfant:
échec d'une contrainte de clé étrangère (laravel
.articles
, CONSTRAINTarticles_user_id_foreign
FOREIGN KEY (user_id
) RÉFÉRENCESusers
(id
) ON DELETE CASCADE)
(SQL: insérer dansarticles
(title
,user_id
,body
,updated_at
,created_at
) valeurs (rao, 1, sflkkjk, 2016-03-01 20:45:32, 2016-03-01 20:45: 32))
SQLSTATE [23000]: Violation de contrainte d'intégrité: 1452 Impossible d'ajouter ou de mettre à jour une ligne enfant:
échec d'une contrainte de clé étrangère (laravel
.articles
, CONSTRAINTarticles_user_id_foreign
FOREIGN KEY (user_id
) RÉFÉRENCESusers
(id
) ON DELETE CASCADE)
(SQL: insérer dansarticles
(title
,user_id
,body
,updated_at
,created_at
) valeurs (rao, 1, sflkkjk, 2016-03-01 20:45:32, 2016-03-01 20:45: 32))
Enregistrez d’abord l’enregistrement d’utilisateur d’utilisateur, puis essayez d’insérer un enregistrement puis de l’insérer facilement dans la base de données.
POINT CLÉ
Deux tableaux: l’un est l’article et l’autre, l’utilisateur. Un utilisateur a beaucoup d'articles mais aucun article n'a beaucoup d'utilisateurs. La clé étrangère est donc déplacée vers la table des articles. Si la table utilisateur n'a pas d'enregistrement, vous êtes confronté à la même erreur que précédemment.
En faisant cela, nous pouvons facilement résoudre ce problème.