0
votes

Laravel UUID comme clé primaire et ID comme clé étrangère

J'ai défini un uuid comme clé primaire et j'aimerais utiliser id (incrémentation automatique) comme clé étrangère pour définir les relations.

Les publications et les commentaires ont dans leur migration:

$table->bigInteger('post_id')->unsigned();
$table->foreign('post_id')->references('id')->on('posts')->onDelete('cascade');

Leurs modèles ont:

protected $primaryKey = 'uuid';
protected $keyType = 'string';
public $incrementing = false;

Et les commentaires sur la migration

$table->uuid('uuid')->primary();
$table->bigInteger('id');

Mais si j'exécute la migration, j'obtiens une General error: 1215 Cannot add foreign key constraint (SQL: alter table `comments` add constraint `comments_post_id_foreign` foreign key (`post_id`) references `posts` (`id`) on delete cascade) dont je ne sais pas pourquoi cela se produit? Avant d'ajouter la logique UUID, cela fonctionnait bien, donc je suis sûr que j'ai fait une erreur là-bas, mais je ne suis pas sûr de ce que l'erreur est générique.


0 commentaires

3 Réponses :


0
votes

L'ajout d'une clé étrangère nécessite que la clé référencée et la clé étrangère aient le même type et le même signe. Selon vos migrations, posts.id et comments.id sont des bigints signés mais vous essayez d'ajouter une clé étrangère à un bigint non signé.

Dans vos migrations de posts et de comments , changez

$table->bigInteger('id')->unsigned();

à

$table->bigInteger('id');

et les migrer à nouveau.


0 commentaires

0
votes

Essayez ceci.

$table->foreignId('post_id')->constrained('posts')->onDelete('cascade');


2 commentaires

Merci, ce serait bien de comprendre ce que cela fait exactement et en quoi c'est différent de ce que j'ai.


Veuillez ajouter une explication à votre réponse afin que d'autres puissent en tirer des leçons



0
votes

Vous pouvez essayer ceci.

 /**
 * Create a new UUID column on the table with a foreign key constraint.
 *
 * @param  string  $column
 * @return \Illuminate\Database\Schema\ForeignIdColumnDefinition
 */
public function foreignUuid($column)
{
    return $this->columns[] = new ForeignIdColumnDefinition($this, [
        'type' => 'uuid',
        'name' => $column,
    ]);
}

Vous pouvez jeter un œil à la méthode qui se trouve dans le vendeur / laravel / framework / src / Illuminate / Database / Schema / Blueprint.php

$table->foreignUuid('post_id')->constrained()->onDelete('cascade');


0 commentaires