2010-08-10 4 views
1

situation suivante:Est-il possible d'étendre un modèle avec Doctrine 2?

Parent:

namespace Base; 

/** @Entity @Table(name="section") */ 
class Section extends Skeleton { 
/** 
* @Id @Column(type="integer") 
* @GeneratedValue(strategy="AUTO") 
*/ 
protected $id; 

/** @Column(length=256) */ 
protected $title; 

/** @Column(length=256) */ 
protected $stylesheet; 
} 

enfant:

namespace Base2; 

use \Base\Section AS BaseSection; 

/** @Entity @Table(name="tbl_section") */ 
class Section extends BaseSection { 
/** 
* @Id @Column(type="integer") 
* @GeneratedValue(strategy="AUTO") 
*/ 
protected $id; 

/** @Column(length=256) */ 
protected $title; 

/** @Column(length=256) */ 
protected $stylesheet; 
} 

Lorsque je tente de récupérer une partie de la base de données, il génère une erreur:

PDOException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 't0.id' 
in 'where clause' in /var/www/eage_new_zf/library/Doctrine/DBAL/Connection.php 
on line 567 Call Stack #TimeMemoryFunctionLocation 10.0004489704{main}( 
)../index.php:0 20.03193296632Zend_Controller_Front->dispatch(???, ??? 
)../index.php:27 30.04574505172Zend_Controller_Dispatcher_Standard->dispatch( 
object(Zend_Controller_Request_Http)[39], object(Zend_Controller_Response_Http)[40] 
)../Front.php:954 Variables in local scope (#3) 

Le requête qu'il tente d'exécuter est:

SELECT 
    t1.id AS id2, 
    t1.title AS title3, 
    t1.stylesheet AS stylesheet4 
FROM 
    tbl_section t1 
WHERE 
    t0.id = ? 

t0 n'est pas défini donc techniquement c'est correct Je reçois une erreur. Mais comment résoudre cela? Est-ce un bug dans Doctrine 2? Ou est-ce que je fais quelque chose de mal?

Répondre

2

Vous pouvez utiliser Table unique ou Héritage de table joint. La différence consiste à utiliser une table avec des colonnes NULL, ou à utiliser plusieurs tables en fonction des classes enfants. Consultez le manuel pour mroe informations:

http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/inheritance-mapping.html

Dans votre cas sur la plus haute/classe racine (Base \ Section)

/** 
* @Entity @Table(name="section") 
* @InheritanceType("SINGLE_TABLE") 
* @DiscriminatorColumn(name="discr", type="string") 
* @DiscriminatorMap({"base" = "Base\Section", "child" = "Base2\Section"}) 
*/ 

Nommer les classes est une mauvaise pratique BTW, vous devez nommer vos classes en ce qui concerne ce qu'ils font la mise en œuvre sage. Même s'il duplique des mots déjà inclus dans l'espace de noms, c'est-à-dire Base \ BaseSection et BAse2 \ Base2Section dans votre exemple.

+0

Merci pour votre réponse. J'ai complètement raté la documentation que vous avez mentionnée, mais je suppose que cela fera l'affaire. Je ne sais pas si je suis d'accord avec vous sur la dernière partie, mais c'est juste quelque chose de personnel je suppose. Merci pour la suggestion de toute façon. –

+0

Lien est mort, voici un nouveau: http://doctrine-orm.readthedocs.org/en/latest/reference/inheritance-mapping.html;) –

Questions connexes