Hellow,在《主义》文档中说:“ 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 side
和Inversed side
的所有东西。 这些不过是一些有助于将Doctrine将数据水合到相关模型中的概念。
请从《 Doctrine》文档中阅读以下引用。这可能有助于理解Owning side
和Inversed side
的概念。
“拥有侧”和“相反侧”是ORM的技术概念技术,而不是域模型的概念。你认为是什么您域模型中的拥有方可能与拥有者是教义的。这些无关。
[Doctrine文档中的另一条引文:
Doctrine只会检查关联的拥有方更改。
这意味着关联的拥有方是具有包含外键的表的实体。因此,包含外键的表将仅在原则上被视为更改。
再次从教义文档中找到:
这里公司的一个实例是指所引用实体客户的一个实例,反之亦然。
当我们像上面的示例那样谈论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合并为两个模型。