Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can I access discriminator field from php in doctrine2?

I have an entity which defines inheritance like this:

* @DiscriminatorColumn(name="type", type="string") * @DiscriminatorMap({"text" = "TextAttribute", "boolean" = "BooleanAttribute", "numeric" = "NumericAttribute", "date" = "DateAttribute"}) 

I am wondering is it possible to have getter for field 'type'? I know I can use instanceof (and in most cases this is what I'm doing) but there are few scenarios where $item->getType() would make my life so much easier.

like image 813
Greg Avatar asked Dec 15 '10 13:12

Greg


2 Answers

Extending what beberlei said, you could declare some constants in the Attribute class, and an abstract getType() function. Then, overload it in every derived attribute class.

Something like:

abstract class Attribute {     const TYPE_BOOL = 0;     const TYPE_INT  = 1;     ...     abstract public function getType(); }  class BooleanAttribute extends Attribute {     public function getType() {         return parent::TYPE_BOOL;     } } 
like image 160
xPheRe Avatar answered Sep 23 '22 07:09

xPheRe


Here is how I'd do.

First, you made an AttributeInterface, to be sure that all future new Attribute types will implement the need method :

interface AttributeInterface {     /**      * Return the attribute type      */     public function getType(); } 

Then you create the Attribute abstract class implementing the AttributeInterface interface.

Use the constants in the @DiscrimatorMap call for some consistency

/**  * Attribute  * ...  * @DiscriminatorColumn(name="type", type="string")  * @DiscriminatorMap({Attribute::TYPE_TEXT = "TextAttribute", Attribute::TYPE_BOOLEAN = "BooleanAttribute", Attribute::TYPE_NUMERIC = "NumericAttribute", Attribute::TYPE_DATE = "DateAttribute"})  */ abstract class Attribute implements AttributeInterface {     const TYPE_TEXT    = 'text';     const TYPE_BOOLEAN = 'boolean';     const TYPE_NUMERIC = 'numeric';     const TYPE_DATE    = 'date'; } 

Finally, you create all needed classes, extending Attribute class and implementing the getType() method

/**  * TextAttribute  *  * @ORM\Entity  */ class TextAttribute extends Attribute {     public function getType()     {         return $this::TYPE_TEXT;     } }  /**  * BooleanAttribute  *  * @ORM\Entity  */ class BooleanAttribute extends Attribute {     public function getType()     {         return $this::TYPE_BOOLEAN;     } }  /**  * NumericAttribute  *  * @ORM\Entity  */ class  NumericAttribute extends Attribute {     public function getType()     {         return $this::TYPE_NUMERIC;     } }  /**  * DateAttribute  *  * @ORM\Entity  */ class DateAttribute extends Attribute {     public function getType()     {         return $this::TYPE_DATE;     } }  // And so on... 
like image 38
Byscripts Avatar answered Sep 21 '22 07:09

Byscripts