Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony/doctor类表继承和外键作为主键_Php_Symfony_Inheritance_Doctrine Orm_Shared Primary Key - Fatal编程技术网

Php Symfony/doctor类表继承和外键作为主键

Php Symfony/doctor类表继承和外键作为主键,php,symfony,inheritance,doctrine-orm,shared-primary-key,Php,Symfony,Inheritance,Doctrine Orm,Shared Primary Key,我目前正在使用Symfony 2.5(和Doctrine 2.4.2)设计一个web应用程序,该应用程序必须灵活,以便轻松插入新的模块/捆绑包 所以我有一个实体(比如A),它与抽象类(B和C)有两个一对一的关联。未来的模块将实现两个抽象类中的一个。由于关联是一对一的,所以我将它们设置为抽象类的ID,以便在我们知道 下面是代码的样子: A类: <?php namespace Me\TestBundle\Entity; use Doctrine\ORM\Mapping as ORM; /

我目前正在使用Symfony 2.5(和Doctrine 2.4.2)设计一个web应用程序,该应用程序必须灵活,以便轻松插入新的模块/捆绑包

所以我有一个实体(比如A),它与抽象类(B和C)有两个一对一的关联。未来的模块将实现两个抽象类中的一个。由于关联是一对一的,所以我将它们设置为抽象类的ID,以便在我们知道

下面是代码的样子:

A类:

<?php

namespace Me\TestBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Table()
 * @ORM\Entity
 */
class A
{
  /**
   * @ORM\Column(name="id", type="integer")
   * @ORM\Id
   * @ORM\GeneratedValue(strategy="AUTO")
   */
  private $id;

  /**
   * @ORM\OneToOne(targetEntity="B", cascade={"all"}, mappedBy="a")
   * @ORM\JoinColumn(name="id", referencedColumnName="a_id")
   */
  private $b;

  /**
   * @ORM\OneToOne(targetEntity="C", cascade={"all"}, mappedBy="a")
   * @ORM\JoinColumn(name="id", referencedColumnName="a_id")
   */
  private $c;
}

首先,命令
php应用程序/控制台原则:schema:validate
检查当前模式的有效性。当前模式是上次调用命令
php应用程序/控制台条令:schema:update--force时生成的模式

另一方面,命令
php-app/console-doctor:schema:update--dump-sql
不会执行对模式的实际更新,尽管它可能会发现一些错误,但其他一些错误不会出现

我不理解B类。这个(抽象)类的身份是一种一刀切的关系?无论如何,如果不添加inheritanceType定义,Doctine将忽略@ORD\Id。添加此inheritanceType定义时,原则将使属性“a”成为B的主键。它还将创建另一个名为“a_id”的属性,该属性将作为未来子类(B的扩展)的外键。但是…关系不是遗传的

希望这有助于

<?php

namespace Me\TestBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Table()
 * @ORM\Entity
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="discr", type="string")
 */
abstract class B
{
  /**
   * @ORM\Id
   * @ORM\OneToOne(targetEntity="A", inversedBy="b")
   * @ORM\JoinColumn(name="a_id", referencedColumnName="id")
   */
  private $a;
}