你好,在德学说文档中说:
“ Doctrine只会检查关联的所有权方是否发生更改。”

我在这里读过其他文章,但找不到一个示例可以使我理解为什么如果反面有变化,那么该学说就不会坚持下去。

我以帖子的示例为例:Understanding of “owning side” and “inverse side” concepts in 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.在那种情况下,公司实体的变更可能无法通过学说坚持吗?

最佳答案

删除所有关于Owning sideInversed side的东西。这些不过是一些有助于将Doctrine将数据水合到相关模型中的概念。

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


“拥有侧”和“相反侧”是ORM的技术概念
技术,而不是域模型的概念。你认为是什么
您域模型中的拥有方可能与
拥有方是教义。这些无关。


教义文档中的另一句话:


教义只会检查一个协会的拥有方
变化。


这意味着关联的拥有方是具有包含外键的表的实体。因此,包含外键的表将仅在原则上被视为更改。

再次从教义文档中:


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

关于php - Doctrine :拥有侧和反向侧,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59925867/

10-09 02:18