doctrine / DoctrineFixturesBundle

Symfony integration for the doctrine/data-fixtures library
MIT License
2.44k stars 202 forks source link

Duplicate primary key (uuid) #352

Open chrisooo3 opened 3 years ago

chrisooo3 commented 3 years ago

My fixture file looks like:

<?php
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Common\DataFixtures\DependentFixtureInterface;
use Doctrine\Persistence\ObjectManager;
use Faker\Factory;

final class LoadBookData extends Fixture implements DependentFixtureInterface
{
    private CommandBus $commandBus;

    private QueryBus $queryBus;

    public function __construct(CommandBus $commandBus, QueryBus $queryBus)
    {
        $this->commandBus = $commandBus;
        $this->queryBus = $queryBus;
    }

    public function load(ObjectManager $manager): void
    {
        $faker = Factory::create('pl_PL');

        for ($i = 0; $i < 1; $i++) {
            $command = new CreateBook($faker->sentence(3));
            $this->commandBus->dispatch($command);
        }
    }
}

CreateBook command looks like this:

final class CreateBook implements CommandInterface
{
    private UuidInterface $id;

    private string $title;

    public function __construct(string $title)
    {
        $this->id = Uuid::uuid4();
        $this->title = $title;
    }

    public function getId(): UuidInterface
    {
        return $this->id;
    }

    public function getTitle(): string
    {
        return $this->title;
    }
}

And handler for that command:

final class CreateBookHandler implements CommandHandlerInterface
{
    private Books $books;

    public function __construct(Books $books)
    {
        $this->books = $books;
    }

    public function __invoke(CreateBook $command)
    {
        $book = new Book(
          $command->getId(),
          $command->getTitle()
        );

        $this->books->add($book);
    }
}

After running this command: bin/console doctrine:fixtures:load -n I get following error:

CRITICAL  [console] Error thrown while running command "doctrine:fixtures:load -n". Message: "An exception occurred while executing 'INSERT INTO book (title, id) VALUES (?, ?)' with params ["In illo reprehenderit in.", "8c6b9b43-57c9-4d0c-8310-cbe163d7acd4"]:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '8c6b9b43-57c9-4d0c-8310-cbe163d7acd4' for key 'book.PRIMARY'" ["exception" => Doctrine\DBAL\Exception\UniqueConstraintViolationException^ { …},"command" => "doctrine:fixtures:load -n","message" => """  An exception occurred while executing 'INSERT INTO book (title, id) VALUES (?, ?)' with params ["In illo reprehenderit in.", "8c6b9b43-57c9-4d0c-8310-cbe163d7acd4"]:\n  \n  SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '8c6b9b43-57c9-4d0c-8310-cbe163d7acd4' for key 'book.PRIMARY'  """]

As you can see the id is uuid, so there is no chance for duplicate, but I get an error that it is duplicated. May you let me know why I am getting this type of error?

fd6130 commented 2 years ago

How about using Symfony Uuid component?