Lorsqu'un thème ou une extension doit se charger d'insérer des données initiales, il faut porter une attention particulière aux clés étrangères.
Par exemple, si on a une table de produits et une table de catégories, comment savoir quel identifiant a été utilisé pour la catégorie X à laquelle un produit doit être associé ?
Il n'est pas possible de présumer que la première catégorie enregistrée portera l'identifiant 1 car il se pourrait que des données aient déjà été enregistrées puis effacées de cette table.
Une façon de s'assurer de la valeur d'une clé primaire est de coder sa valeur en dur lors de l'insertion. Mais attention : il faut être certain qu'aucun enregistrement de la table n'utilise cette valeur sinon, l'insertion n'aura pas lieu.
$reussite = $wpdb->insert(
$table_parent,
[
'id' => 1,
'description' => 'blablabla',
'autrechamp' => 1
],
[
'%d',
'%s',
'%d'
]
);
if ( $reussite ) {
$reussite = $wpdb->insert(
$table_enfant,
[
'id' => 1,
'autre_champ' => 'abc',
'tableparent_id' => 1
],
[
'%d',
'%s',
'%d'
]
);
}
if ( ! $reussite ) {
// réagir en cas de problème
monprefixe_log_debug( $wpdb->last_error );
// ...
}
Une autre technique, plus versatile, consiste à retrouver l'identifiant d'une table à l'aide de $wpdb->insert_id puis d'utiliser cette valeur comme clé étrangère.
$reussite = $wpdb->insert(
$table_parent,
[
'description' => 'blablabla',
'autrechamp' => 1
],
[
'%s',
'%d'
]
);
$nouveau_id = $wpdb->insert_id;
if ( $reussite ) {
$reussite = $wpdb->insert(
$table_enfant,
[
'id' => 1,
'autre_champ' => 'abc',
'tableparent_id' => $nouveau_id
],
[
'%d',
'%s',
'%d'
]
);
}
if ( ! $reussite ) {
// réagir en cas de problème
monprefixe_log_debug( $wpdb->last_error );
// ...
}
▼Publicité