@slip31

Как использовать Doctrine для сохранения связанных сущностей?

Здравствуйте. Есть у меня один проект написанный на чистом PHP.
Я в нем создаю сущность Company с помощью хендлера (ну моя реализация CommandBus). У каждой компании есть услуги, которые она оказывает - массив company_services. Встал вопрос о подключении ко всему этому Symfony. Но ок - коммандбас связал с Messenger, value object сделал с помощью Embeddable, остался вопрос, как добавить услуги компании в репозиторий.
/**
 * @ORM\Entity(repositoryClass=CompanyRepository::class)
 * @Table(name="company")
 */
final class Company {

    /**
     * @Embedded(class = "Id",columnPrefix=false)
     */
    private Id $id;

    /**
     * @Embedded(class = "Inn",columnPrefix=false)
     */
    private Inn $inn;
    /**
/**
     * @ORM\OneToMany(targetEntity="App\Company\Domain\Entity\CompanyServices", mappedBy="company")
     * @Assert\NotNull
     */
    private array $company_services;
    public function __construct(
        Id $id,
        Inn $inn,    
        Address $address,
        array $company_services,
        DateTimeImmutable $date
    )
  
}

И так мне нужно сохранить это в хендлере
public function __invoke(CommandInterface $command): void
    {
        $company = new Company(
            $id = Id::next(),
            new Inn($command->getInn()),
            new Address(
            ...
            ),
            $command->getCompanyServices(),
            $date = new DateTimeImmutable()
        );
        $this->repository->add($company);
            }
    }


Company сохраняется, всё ок. Но мне нужно еще сохранить массив $company_services как связанную сущность. На чистом php всё понятно - я в репозитории просто с PDO сохраняю в цикле, а вот с симфони не очень. В документации используются сеттеры и потом всё сохраняется flush(). Но у меня нет сеттеров, у меня конструкторы. Я могу создать в Company что-то вроде сеттера public function addCompanyServices($services) {} Но что с ним делать дальше?
Как понимаю, в симфони по феншую - это создать entity CompanyService, к ней, соответственно, репозиторий, но и как это всё сохранить без сеттеров в CompanyService и из хендлера? Ну не понимаю я документации.
  • Вопрос задан
  • 202 просмотра
Решения вопроса 1
Maksclub
@Maksclub
maksfedorov.ru
Persistence by Reachability: Cascade Persist
There are additional semantics that apply to the Cascade Persist operation. During each flush() operation Doctrine detects if there are new entities in any collection and three possible cases can happen:

  • New entities in a collection marked as cascade: persist will be directly persisted by Doctrine.
  • New entities in a collection not marked as cascade: persist will produce an Exception and rollback the flush() operation.
  • Collections without new entities are skipped.

https://www.doctrine-project.org/projects/doctrine...

/**
 * @OneToMany(targetEntity="Article", mappedBy="topic", cascade={"persist", "remove"})
 */
 private $articles;
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы