首页 > 解决方案 > 学说:拥有的一面和相反的一面

问题描述

Hellow,在 de 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. 公司实体中的 setCustomer 方法如何?(以反映此数据库模型) 2. 在这种情况下,可能是公司实体的更改无法通过教义持久化?

标签: phpdoctrineassociationsobject-model

解决方案


Owning side把你脑子里所有关于和的东西都拿出来Inversed side这些只是帮助 Doctrine 将数据水合到相关模型中的一些概念

阅读 Doctrine doc 中的以下引文。这可能有助于理解 和 的Owning side概念Inversed side

“拥有方”和“反向方”是 ORM 技术的技术概念,而不是您的领域模型的概念。您在域模型中认为的拥有方可能与 Doctrine 的拥有方不同。这些是无关的。

Doctrine doc的另一个引文:

Doctrine 只会检查关联的拥有方是否有更改。

这意味着关联的拥有方是具有包含外键的表的实体。因此,包含外键的表只会被原则考虑进行更改。

再次来自 Doctrine 文档:

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


推荐阅读