请问,任何人都可以用Doctrine中“拥有方”和“反方”概念的例子来解释吗?我知道他们有必要组织双向关系,但我无法实现Doctrine文档中的文字(link):
协会的每一方都有2个参考,这2个 引用既代表相同的关联,又可以改变 彼此独立。
修改
例如,我有实体客户(拥有方)和公司(反方)。首先,我做了以下事情:
$customer = new Customer();
$company = new Company();
$customer->setCompany($company);
$company->setCustomer($customer);
然后我可以有两种情况:
情景1
$company->getCustomer()->setName(‘John’);
$entityManager->persist($company);
$entityManager->flush();
情景2
$customer->getCompany()->setLicenseNumber(‘24535’);
$entityManager->persist($company);
$entityManager->flush();
我是否理解正确,在第一种情况下,关联将被正确保留,因为拥有方(通过getCustomer())被更改,但在第二种情况下它将被忽略,因为拥有方不会更改?
答案 0 :(得分:1)
我尝试将文档中的引号添加到我的答案中。如果您/某人不同意我的回答,或者您认为有可能改进解释,请发表评论......
Company
和User
...
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;
// ...
}
一个例子:
$company= $em->find('Application\Entity\Company', 1);
$customer = $em->find('Application\Entity\Customer', 1);
$customer->setCompany($company);
$em->persist($customer);
$em->flush();
如果您现在$customer = $company->getCustomer();
,您将获得身份1的Customer
。
现在想象一下$company->setCustomer( $this );
方法中没有setCompany
行。如果您在设置$customer = $company->getCustomer();
之后再进行$company
,则不会得到ID为1的Customer
。换句话说,反面的关联与您的数据库模型不对应,并且与在拥有方面的参考。