J'essaie d'insérer des valeurs dans ma table de commentaires et j'obtiens une erreur. Sa disant que je ne peux pas ajouter ou mettre à jour la ligne enfant et je n'ai aucune idée de ce que cela signifie.
mon schéma ressemble à quelque chose comme ça
-- ----------------------------
-- Table structure for `comments`
-- ----------------------------
DROP TABLE IF EXISTS `comments`;
CREATE TABLE `comments` (
`id` varchar(36) NOT NULL,
`project_id` varchar(36) NOT NULL,
`user_id` varchar(36) NOT NULL,
`task_id` varchar(36) NOT NULL,
`data_type_id` varchar(36) NOT NULL,
`data_path` varchar(255) DEFAULT NULL,
`message` longtext,
`created` datetime DEFAULT NULL,
`modified` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_comments_users` (`user_id`),
KEY `fk_comments_projects1` (`project_id`),
KEY `fk_comments_data_types1` (`data_type_id`),
CONSTRAINT `fk_comments_data_types1` FOREIGN KEY (`data_type_id`) REFERENCES `data_types` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `fk_comments_projects1` FOREIGN KEY (`project_id`) REFERENCES `projects` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `fk_comments_users` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf32;
-- ----------------------------
-- Records of comments
-- ----------------------------
-- ----------------------------
-- Table structure for `projects`
-- ----------------------------
DROP TABLE IF EXISTS `projects`;
CREATE TABLE `projects` (
`id` varchar(36) NOT NULL,
`user_id` varchar(36) NOT NULL,
`title` varchar(45) DEFAULT NULL,
`description` longtext,
`created` datetime DEFAULT NULL,
`modified` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_projects_users1` (`user_id`),
CONSTRAINT `fk_projects_users1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf32;
-- ----------------------------
-- Records of projects
-- ----------------------------
INSERT INTO `projects` VALUES ('50dcbc72-3410-4596-8b71-0e80ae7aaee3', '50dcbc5c-d684-40bf-9715-0becae7aaee3', 'Brand New Project', 'This is a brand new project', '2012-12-27 15:24:02', '2012-12-27 15:24:02');
et la déclaration mysql que j'essaie de faire ressemble à ceci
INSERT INTO `anthonyl_fbpj`.`comments` (`project_id`, `user_id`, `task_id`, `data_type_id`, `message`, `modified`, `created`, `id`)
VALUES ('50dc845a-83e4-4db3-8705-5432ae7aaee3', '50dcbc5c-d684-40bf-9715-0becae7aaee3', '1', '50d32e5c-abdc-491a-a0ef-25d84e9f49a8', 'this is a test', '2012-12-27 19:20:46', '2012-12-27 19:20:46', '50dcf3ee-8bf4-4685-aa45-4eb4ae7aaee3')
l'erreur que je reçois ressemble à ceci
SQLSTATE [23000]: Violation de contrainte d'intégrité: 1452 Impossible d'ajouter ou de mettre à jour une ligne enfant: une contrainte de clé étrangère échoue (
anthonyl_fbpj
.comments
, CONTRAINTESfk_comments_projects1
CLÉ ÉTRANGÈRE (project_id
) RÉFÉRENCESprojects
(id
) ON DELETE NO ACTION ON UPDATE NO ACTION)
Cela signifie simplement que la valeur de la colonne project_id
sur la table comments
que vous insérez n’existe pas sur la table projects
. Gardez à l'esprit que les valeurs de la colonne project_id
sur la table comments
dépend des valeurs de ID
sur la table Projects
.
La valeur 50dc845a-83e4-4db3-8705-5432ae7aaee3
vous insérez pour la colonne project_id
n'existe pas sur la table projects
.
Assurez-vous que vous avez project_id
dans la propriété fillable
de votre modèle Comment
.
J'ai eu le même problème, et c'était la raison.
Assurez-vous également que la clé étrangère que vous ajoutez est du même type que la colonne d'origine. Si la colonne à laquelle vous faites référence n'est pas du même type, elle échouera également.
Dans le cas où quelqu'un utilise Laravel et obtient ce problème. Je l'obtenais aussi et le problème était dans l'ordre dans lequel j'insérais les identifiants (c'est-à-dire les clés étrangères) dans le dossier tableau croisé dynamique.
Pour être concret, trouvez ci-dessous un exemple de relation plusieurs à plusieurs:
wordtokens <-> wordtoken_wordchunk <-> wordchunks
// wordtoken_wordchunk table
Schema::create('wordtoken_wordchunk', function(Blueprint $table) {
$table->integer('wordtoken_id')->unsigned();
$table->integer('wordchunk_id')->unsigned();
$table->foreign('wordtoken_id')->references('id')->on('Word_tokens')->onDelete('cascade');
$table->foreign('wordchunk_id')->references('id')->on('wordchunks')->onDelete('cascade');
$table->primary(['wordtoken_id', 'wordchunk_id']);
});
// wordchunks table
Schema::create('wordchunks', function (Blueprint $table) {
$table->increments('id');
$table->timestamps();
$table->string('text');
});
// wordtokens table
Schema::create('Word_tokens', function (Blueprint $table) {
$table->increments('id');
$table->string('text');
});
Maintenant, mes modèles ressemblent à ce qui suit:
class WordToken extends Model
{
public function wordchunks() {
return $this->belongsToMany('App\Wordchunk');
}
}
class Wordchunk extends Model
{
public function wordTokens() {
return $this->belongsToMany('App\WordToken', 'wordtoken_wordchunk', 'wordchunk_id', 'wordtoken_id');
}
}
J'ai résolu le problème en échangeant l'ordre de 'wordchunk_id' et 'wordtoken_id' dans le modèle Wordchunk.
Pour compléter le code, voici comment je persiste dans les modèles:
private function persistChunks($chunks) {
foreach ($chunks as $chunk) {
$model = new Wordchunk();
$model->text = implode(' ', array_map(function($token) {return $token->text;}, $chunk));
$tokenIds = array_map(function($token) {return $token->id;}, $chunk);
$model->save();
$model->wordTokens()->attach($tokenIds);
}
}
J'espère que ma décision aidera. J'ai eu une erreur similaire à Laravel. J'ai ajouté une clé étrangère à la mauvaise table.
Mauvais code:
Schema::create('comments', function (Blueprint $table) {
$table->unsignedBigInteger('post_id')->index()->nullable();
...
$table->foreign('post_id')->references('id')->on('comments')->onDelete('cascade');
});
Schema::create('posts', function (Blueprint $table) {
$table->bigIncrements('id');
...
});
S'il vous plaît noter à la fonction sur ('commentaires') ci-dessus. Code correct
$table->foreign('post_id')->references('id')->on('posts')->onDelete('cascade');
Commencez par supprimer la contrainte "fk_comments_projects1" ainsi que son index. Après cela, recréez-le.
J'ai eu ce problème quand j'utilisais accidentellement le MAUVAIS "uuid" dans mon dossier enfant. Lorsque cela se produit, la contrainte, de l’enfant à l’enregistrement parent, vérifie que le lien est correct. Je le générais manuellement, alors que j'avais déjà configuré mon modèle pour le faire automatiquement. Donc, ma solution était:
$parent = Parent:create($recData); // asssigning autogenerated uuid into $parent
Ensuite, lorsque j'ai appelé ma classe enfant pour insérer des enfants, j'ai passé cette valeur var:
$parent->uuid
J'espère que ça t'as aidé.
Peut-être avez-vous des lignes dans la table que vous souhaitez créer de FK.
Exécutez la migration avec foreign_key_checks OFF Insérez uniquement les enregistrements pour lesquels le champ id correspondant est contenu dans la table de contenu.