[Resolvido] Doctrine ORM
Afinal de contas, o Doctrine implementa ou não a estratégia de herança JOINED? O mapeamento é idêntico entre JOINED e SINGLE_TABLE, porém parece que só SINGLE_TABLE funciona.
CREATE TABLE pessoas (id int(5) unsigned NOT NULL AUTO_INCREMENT,nome varchar(80) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB;
CREATE TABLE `alunos` (matricula varchar(80) NOT NULL,curso_id int(5) unsigned NOT NULL,pessoa_id int(5) unsigned NOT NULL,UNIQUE KEY
matricula (matricula),KEY
pessoa_id (pessoa_id),KEY
curso_id (curso_id),CONSTRAINT
alunos_ibfk_1 FOREIGN KEY (pessoa_id) REFERENCES pessoas (id),CONSTRAINT
alunos_ibfk_2 FOREIGN KEY (curso_id) REFERENCES cursos (id)) ENGINE=InnoDB;
CREATE TABLE `cursos` (id int(5) unsigned NOT NULL AUTO_INCREMENT,nome varchar(80) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT 'o nome dos cursos que devem ser únicos',PRIMARY KEY (
id),UNIQUE KEY
nome (nome)) ENGINE=InnoDB;
INSERT INTO cursos(nome) VALUES('Física');
<?php
namespace model;
class Curso {
private $id;
private $nome;
private $alunos = array();
public function getId() {
return $this->id;
}
public function setId($id) {
$this->id = $id;
}
public function getNome() {
return $this->nome;
}
public function setNome($nome) {
$this->nome = $nome;
}
public function getAlunos() {
return $this->alunos;
}
}
?>
<?php
namespace model;
abstract class Pessoa {
private $id;
private $nome;
public function getId() {
return $this->id;
}
public function setId($id) {
$this->id = $id;
}
public function getNome() {
return $this->nome;
}
public function setNome($nome) {
$this->nome = $nome;
}
}
?>
<?php
namespace model;
class Aluno extends Pessoa{
private $matricula;
private $curso;
public function getMatricula() {
return $this->matricula;
}
public function setMatricula($matricula) {
$this->matricula = $matricula;
}
public function getCurso() {
return $this->curso;
}
public function setCurso(Curso $curso) {
$this->curso = $curso;
}
}
?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
<entity name="model\Pessoa" table="pessoas" inheritance-type="JOINED">
<!-- discriminator-map só faz sentido na estratégia single_table -->
<discriminator-map>
<discriminator-mapping value="aluno" class="model\Aluno"/>
</discriminator-map>
<id name="id" type="integer">
<generator strategy="IDENTITY"/>
</id>
<field name="nome" type="string" length="255" nullable="false"/>
</entity>
</doctrine-mapping>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
<entity name="model\Aluno" table="alunos">
<discriminator-column name="pessoa_id" type="integer"/>
<field name="matricula" type="string" length="255" nullable="false" unique="true" />
<one-to-one field="curso" target-entity="model\Curso" inversed-by="alunos">
<join-column name="curso_id" referenced-column-name="id"/>
<cascade>
<cascade-persist/>
<cascade-merge/>
<cascade-refresh/>
</cascade>
</one-to-one>
</entity>
</doctrine-mapping>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
<entity name="model\Curso" table="cursos">
<id name="id" type="integer">
<generator strategy="IDENTITY"/>
</id>
<field name="nome" nullable="false" type="string" length="255"/>
<one-to-many target-entity="model\Aluno" mapped-by="curso" field="alunos">
<cascade><cascade-all/></cascade>
</one-to-many>
</entity>
</doctrine-mapping>
#index.php
#esta é a parte que interesa
#EchoSQLLogger para exibir o SQL montado.
$configuration->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger());
$em = \Doctrine\ORM\EntityManager::create($options, $configuration);
$aluno = new model\Aluno();
$aluno->setCurso($em->find("model\Curso", 1));
$aluno->setMatricula("123abc");
$aluno->setNome("Rafael");
$em->persist($aluno);
$em->flush();
O erro é o seguinte:
"INSERT INTO pessoas (nome, dtype) VALUES (?, ?) array(2) { [1]=> string(6) "Rafael" [2]=> string(11) "aluno" }
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'dtype' in 'field list'' in..."
Ou seja, JOINED está tentando inserir o valor definido em 'value' na tag <discriminator-mapping> numa coluna que não existe na tabela pessoas. Segui o manual do Doctrine e é evidente que ele está errado. Por isso, qual é o jeito certo? Ou não há jeito certo porque JOINED não é suportado por este ORM?
Discussão (12)
Carregando comentários...