Używam mysql-workbench-exporter do generowania klas annotation entities w katalogu Entity. I teraz próbuje stworzyć mechanizm podobny do tego używanego w symfony 1.4. Exporter generuje klasy, ja natomiast chcę po tych klasach dziedziczyć i rozszerzać je według potrzeb. Chcę uczynić ten proces w pełni automatycznym:
1. Generowanie klas Entities z workbencha,
2. Update schemy,
3. Zmiany manualne w klasach dziedziczących.
Poniżej przykład tego co chcę osiągnąć:
1. Plik generowany z workbencha:
namespace Project\DatabaseBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * Project\DatabaseBundle\Entity\Article * * @ORM\MappedSuperclass * @ORM\Entity(repositoryClass="ArticleRepository") * @ORM\Table(name="article") */ class ArticleBase { /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @ORM\Column(type="string", length=255, nullable=true) */ protected $title; public function __construct() { } /** * Set the value of id. * * @param integer $id * @return \Project\DatabaseBundle\Entity\Article */ public function setId($id) { $this->id = $id; return $this; } /** * Get the value of id. * * @return integer */ public function getId() { return $this->id; } /** * Set the value of title. * * @param string $title * @return \Project\DatabaseBundle\Entity\Article */ public function setTitle($title) { $this->title = $title; return $this; } /** * Get the value of title. * * @return string */ public function getTitle() { return $this->title; } public function __sleep() { } }
2. Plik dziedziczący po ArticleBase:
namespace Project\DatabaseBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * Project\DatabaseBundle\Entity\Article * */ class Article extends ArticleBase { }
Pojawił mi się problem... A mianowicie ogólnodostępny exporter workbencha, co udało mi się przeanalizować (może nie zauważyłem tam jakiejś opcji) generuje tylko klasy z domyślną nazwą (nie można wymusić żeby zamiast Article wygenerował nazwę ArticleBase), co niestety nie pozwala na prawidłowe działanie Entities (klasa instancji domyślnie musi mieć zawsze nazwę Article). I teraz pytanie. Czy ktoś już kiedyś zastanawiał się nad takim problemem i znalazł rozwiązanie? Może istnieje jakiś prostszy sposób na to? Może można w inny sposób dojść do tego samego? Bo inaczej to zostaje już tylko grzebanie w kodzie tego exportera...
Zastanawia mnie też dlaczego nigdzie nie mogę znaleźć tak typowego przykładu z dziedziczeniem klas entities jako podstawowego rozwiązania dla modelu... Mieszanie w podstawowych klasach jest dobre, jak model jest tworzony bezpośrednio z pliku annotations, ale dla źródeł zewnętrznych bez klasy bazowej raczej się nie obejdzie...
Dodatkowo jeszcze prośba o zweryfikowanie powyższych klas, bo wyrzuca błąd przy SQL w mapowaniu klasy.
W kontrolerze korzystam z kodu:
$articleObj = new Article(); $articleObj->setTitle('aa'); $em = $this->getDoctrine()->getManager(); $em->persist($articleObj); $em->flush();
An exception occurred while executing 'INSERT INTO Article (title) VALUES (?)' with params {"1":"aa"}:
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'livesoft_test.Article' doesn't exist
Zaznaczam, że bez dziedziczenia problem nie występuje. Prośba o poprawienie kodu, bo już nie wiem w czym jest problem. Jeszcze raz trzeba te annotacje dot. klasy pisać?