Проблемы с наследованием с Symfony2, Doctrine2 - PullRequest
2 голосов
/ 27 сентября 2011

Я отредактировал некоторые ошибки и детали ...

Ну, я пытался создать наследство, используя Product в качестве родителя и Film and Book в качестве потомков. Проверка онлайн и официальной документации не решила мою проблему, потому что примеры скудны и неполны. (http://www.doctrine -project.org / документы / ОРМ / 2.0 / о / ссылки / наследования mapping.html # класс таблица наследование).

Я не уверен, правильно ли я это сделал, и теперь я просто не знаю, как генерировать, манипулировать и сохранять унаследованные объекты.

Родительский класс

<?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;
}

доктрина: схема: обновление --force генерирует 2 таблицы: ProductE ... (идентификатор первичного ключа, диск не знаю, как работает, остальные поля) 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 (). Так не генерируется, когда я использую persist ...

1 Ответ

4 голосов
/ 05 октября 2011

Вы не можете иметь два первичных ключа в унаследованном классе просто потому, что это позволяет вам сохранить базовый класс объекта.Вы можете найти пример здесь , он отлично работает.За исключением того, что более сложные в использовании запросы должны фильтровать конкретные экземпляры, но все возможно

...