学说:正反面

Doctrine: owning side and inverse side

您好,在 de Doctrine 文档中说: 'Doctrine will only check the owning side of an association for changes.'

我在这里阅读了其他 posts,但我找不到一个例子让我理解为什么如果反面发生变化,这不会被学说坚持。

我以post为例:

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.公司实体中的setCustomer方法如何? (以反映此数据库模型) 2. 在那种情况下,公司实体的变更可能无法按原则坚持?

把你脑子里关于 Owning sideInversed side 的所有东西都去掉。 这些只不过是帮助 Doctrine 水合物数据进入相关模型的一些概念

阅读 Doctrine 文档中的以下引文。这可能有助于理解 Owning sideInversed side.

的概念

"Owning side" and "inverse side" are technical concepts of the ORM technology, not concepts of your domain model. What you consider as the owning side in your domain model can be different from what the owning side is for Doctrine. These are unrelated.

Doctrine 文档的另一段引述:

Doctrine will only check the owning side of an association for changes.

这意味着关联的拥有方是 table 包含外键 的实体。因此,包含外键的 table 只会被学说考虑更改。

再次来自 Doctrine 文档:

  • OneToOne - 当前实体的一个实例引用被引用实体的一个实例
  • OneToOne 关联的拥有方是 table 包含外键
  • 的实体

此处 Company 的一个实例指的是被引用实体 Customer 的一个实例,反之亦然。

当我们像上面的例子那样谈论 OneToOne 关联时,拥有方 将是具有 table 的实体包含外键,因此,Customer 实体。

根据您的示例,Doctrine 将创建 table 如下所示:

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 水合到两个模型中。