php - 学说:拥有的一面和相反的一面
问题描述
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. 在这种情况下,可能是公司实体的更改无法通过教义持久化?
解决方案
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 合并到两个模型中。
推荐阅读
- oauth - 向用户公开 Slack 用户令牌是否安全?
- linux - 删除日志数据以重新获得 oracle 中的可用硬盘空间
- python - 将 PDF 中的 Fortran 代码提取到文本文件中?
- python - 基于旧 URL 的 Django 重定向 URL
- javascript - 由于 useEffect 重新渲染,图表重复
- python - 如何使用变量而不是直接输入在 Python 中对齐文本?
- c++ - 在 C++ 中重载后自增运算符
- r - 如何使用相似性网络融合 R 代码
- sql - (错误)SQL 代码 -530,错误外键 PAY$ID$U 的插入或更新值无效
- javascript - 带有文件的chrome executeScript没有做任何事情