views:

32

answers:

1

Following situation:

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

Child:

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

When I try to retrieve an Section from the database it throws an error:

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) 

The query it tries to execute is:

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

t0 is not defined so technically it is correct I get an error. But how to solve this? Is it a bug in Doctrine 2? Or am I doing something wrong.

+1  A: 

You can either use Single Table or Joined Table Inheritance. The difference is using either one table with nullable columns, or use many tables depending on the child classes. See the manual for mroe information:

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

In your case on the topmost/root class (Base\Section)

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

Naming classes is a bad practice btw, you should name your classes with regard to what they are doing implementation wise. Even if it duplicates words already included in the namespace, i.e. Base\BaseSection and BAse2\Base2Section in your example.

beberlei
Thanks for your answer. I completely missed the documentation you mentioned, but I suppose this will do.I do not know if I agree with you on the last part, but that is just something personal I guess. Thanks for the suggestion anyways.
Stegeman