与Symfony2,Doctrine2继承的问题

时间:2011-09-27 10:52:26

标签: inheritance symfony annotations doctrine

我编辑了一些错误和细节......

好吧,我一直在尝试使用Product作为父级,将Film和Book作为子级创建继承。在线检查和官方文档没有解决我的问题,因为示例很差且不完整。 (http://www.doctrine-project.org/docs/orm/2.0/en/reference/inheritance-mapping.html#class-table-inheritance)。

我不确定我是否做得对,现在我只是不知道如何生成,操纵和持久化继承的对象。

父类

<?php
namespace Paf\MyBundle\Entity;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Table()
 * @ORM\Entity
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="discr", type="string")
 * @ORM\DiscriminatorMap({ "film" = "FilmE2" , "book" = "BookE2" })
*/

class ProductEjemplo2 
{

/**
 * @var integer $id
 * @ORM\Id
 * @ORM\Column(name="id", type="integer")
 * @ORM\GeneratedValue(strategy="AUTO")
 */
protected $id;
//More fields, Name, Description ...
}

儿童班

<?php 
//Paf\MyBundle\Entity\FilmE2
namespace Paf\MyBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Table()
* @ORM\Entity
*/

class FilmE2 extends ProductEjemplo2
{
/**
  * @var integer $id
  * @ORM\Id
  * @ORM\Column(name="id", type="integer")
  */
 protected $id;
}

doctrine:schema:update --force生成2个表: ProductE ...(id主键,disc dunno如何工作,其余字段) FilmE2(id主键,其余字段)

public function create2Action()  
{
$product1 = new ProductEjemplo2();
$product1->setName('New Film 1'); //and more fields
//here $product1 ID is null.(autogenerated but yet without value)
$em->persist($product1); //error, non-object....
$em->flush();

$film = new FilmE2();
$film->setName('New Film 1'); //and more fields
$film->setDirector('dir1');
$film->setId(1);
$em->persist($film); //error, non-object....
$em->flush();
//In both cases happens the same.

这不起作用,这是非常明显的,因为说错误“非对象”不能持久 ...但是如果我尝试使用新的Filme2()会发生相同的......我我意识到当我使用flush()时,产品的ID是自动生成的。所以当我使用persist时不会生成...

1 个答案:

答案 0 :(得分:4)

继承类中不能有两个主键,只是因为它允许您持久保存基础对象类。你可以找到一个例子here它可以正常工作。除了使用更复杂的查询之外,还应该过滤特定的实例,但一切皆有可能