gpt4 book ai didi

php - Doctrine :正反面

转载 作者:行者123 更新时间:2023-12-05 00:01:00 24 4
gpt4 key购买 nike

你好,在 de Doctrine 文档中说:“Doctrine 只会检查关联的拥有方是否有更改。”

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

我以帖子为例:Understanding of “owning side” and “inverse side” concepts in Doctrine

客户实体:

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 );
}
}

公司实体:

class Company
{
// ...

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

// ...
}

我有两个问题:1.公司实体中的setCustomer方法如何? (以反射(reflect)此数据库模型)2. 在那种情况下,公司实体的变更可能无法按 Doctrine 坚持?

最佳答案

去掉你脑海中关于Owning sideInverse side 的所有东西。 这些只不过是帮助 Doctrine 将数据融入相关模型的一些概念

阅读 Doctrine 文档中的以下引文。这可能有助于理解Owning sideInverted 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.

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

再次来自 Doctrine 文档:

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

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

当我们像上面的示例那样讨论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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com