理解学说中的“拥有方”和“反方”概念

时间:2016-01-07 10:20:05

标签: php doctrine-orm

请问,任何人都可以用Doctrine中“拥有方”和“反方”概念的例子来解释吗?我知道他们有必要组织双向关系,但我无法实现Doctrine文档中的文字(link):

  

协会的每一方都有2个参考,这2个   引用既代表相同的关联,又可以改变   彼此独立。

  1. 为什么每边有2个参考,总共4个?现在,在 总共,我只看到从A(拥有方)到B(反向)的2个引用 ()),从B到A。
  2. 在哪种情况下,引用可以独立更改 另一个?
  3. 在记忆中发生什么会触发“拥有一方”的必要性 “反面使用?
  4. “参考”和“关联”之间有什么区别?
  5. 修改
    例如,我有实体客户(拥有方)和公司(反方)。首先,我做了以下事情:

    $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())被更改,但在第二种情况下它将被忽略,因为拥有方不会更改?

1 个答案:

答案 0 :(得分:1)

  1. 你应该读作:协会两边有2个引用,一个 所以没有4个但是2个......
  2. 在正确的应用程序中,应用程序开发人员正确维护双向关联的语义
    换句话说,如果你正确地实现这种关系,他们可以,但不应该。
  3. 忽略仅对关联的反面所做的更改。
    所以原则上(为了使你的数据库模型保持最新)只维护拥有的一面就足够了,但在你的对象模型中你(也许)也喜欢从反面访问你的关联,当你访问反面时你希望值(例如反面的数组集合)是正确的,这就是你应该照顾双方的原因。
  4. 我认为这样的事情:关联是实际的关系,引用就像这种关系的句柄。
  5. 我尝试将文档中的引号添加到我的答案中。如果您/某人不同意我的回答,或者您认为有可能改进解释,请发表评论......

    UPDATE:

    CompanyUser ...

    的示例

    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。换句话说,反面的关联与您的数据库模型不对应,并且与在拥有方面的参考。