Doctrine: собственная сторона и обратная сторона - PullRequest
3 голосов
/ 27 января 2020

Hellow, в документации de 1018 * говорится: 'Doctrine будет проверять только изменения на стороне-владельце ассоциации.'

Я прочитал другие посты здесь, но не могу найти пример, который заставляет меня понять, почему, если есть изменение в обратной стороне, это не будет сохранено doctrine.

Я возьму пример поста: Понимание «владеющей стороны» и « понятия "обратная сторона" в Doctrine

Customer сущность:

class Customer
{
    // ...

    /** ONE-TO-ONE BIDIRECTIONAL, OWNING SIDE
     * @ORM\OneToOne(targetEntity="Company", inversedBy="customer")
     * @ORM\JoinColumn(name="company_id", referencedColumnName="id")
     */
    private $company;

    // ...

    /**
     * Set company method
     *
     * @param Company $company
     */
    public function setCompany( Company $company )
    {
       $this->company = $company; 
       $company->setCustomer( $this );
    }
}

Company сущность:

class Company
{
    // ...

    /** ONE-TO-ONE BIDIRECTIONAL, INVERSE SIDE
     * @OneToOne(targetEntity="Customer", mappedBy="company")
     */
    private $customer;

    // ...
}

и у меня два вопроса : 1. Как будет установлен метод Customer в Company Entity? (чтобы отразить эту модель базы данных) 2. В этом случае может случиться так, что изменение в Компании не будет сохраняться до doctrine?

1 Ответ

1 голос
/ 27 января 2020

Убери все, что есть в твоей голове о Owning side и Inversed side. Это не что иное, как некоторые понятия, которые помогают Doctrine объединить данные в родственные модели .

Прочитайте следующую цитату из Doctrine do c. Это может несколько помочь понять концепцию Owning side и Inversed side.

«Сторона владения» и «обратная сторона» - это технические концепции технологии ORM, а не концепции модели вашего домена. То, что вы рассматриваете как сторону-владельца в вашей доменной модели, может отличаться от того, что является стороной-владельцем для Doctrine. Они не связаны между собой.

Другая цитата из Doctrine do c:

Doctrine будет проверять только сторону-владельца ассоциации на предмет изменений.

Это означает, что владельцем является ассоциация с таблицей, содержащей внешний ключ . Поэтому таблица, содержащая внешний ключ, будет считаться doctrine только для изменений.

Еще раз из Doctrine do c:

  • OneToOne - Один экземпляр текущего объекта ссылается на один экземпляр указанного объекта .
  • Сторона-владелец ассоциации OneToOne - это объект с таблицей, содержащей внешний ключ

Здесь один экземпляр Компания относится к одному экземпляру упомянутой сущности Клиент или наоборот.

Когда мы говорим о OneToOne ассоциация, как ваш пример выше, сторона-владелец будет сущностью с таблицей, содержащей внешний ключ, поэтому Customer сущность.

В вашем примере , Doctrine создаст таблицы, подобные приведенным ниже:

CREATE TABLE Company (
    id INT AUTO_INCREMENT NOT NULL,
    PRIMARY KEY(id)
) ENGINE = InnoDB;

CREATE TABLE Customer (
    id INT AUTO_INCREMENT NOT NULL,
    company_id INT DEFAULT NULL,
    PRIMARY KEY(id)
) ENGINE = InnoDB;
ALTER TABLE Customer ADD FOREIGN KEY (company_id) REFERENCES Company(id);

Теперь, если вы хотите получить данные для клиента, связанного с компанией, запрос будет:

SELECT Company.id AS CompanyID, Customer.id AS CustomerID
FROM Company
LEFT JOIN Customer ON Company.id = Customer.company.id;

возвращенный результат от этого типа запроса будет быть гидратированным в обеих моделях Doctrine.

...