你好,在德学说文档中说:
“ Doctrine只会检查关联的所有权方是否发生更改。”
我在这里读过其他文章,但找不到一个示例可以使我理解为什么如果反面有变化,那么该学说就不会坚持下去。
我以帖子的示例为例:Understanding of “owning side” and “inverse side” concepts in DoctrineCustomer
实体:
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》文档中的以下引文。这可能有助于理解Owning side
和Inversed 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/