2013-05-27 3 views
1

Я сталкиваюсь с этой проблемой с учением, и никто в моем окружении не может помочь мне в этом. Так что я надеялся, что кто-то здесь знает:Учет доктрины и наследование классов классов

Im работает со следующей структурой:

Entity: MLT

/** 
* @Entity 
*/ 
class MLT 
{ 
    /** 
    * @OneToMany(targetEntity="\WAD\Common\LT", cascade={"remove"}, mappedBy="term") 
    */ 
    private $languageTerms; 
} 

Entity: LT

/** 
* @Entity 
* @InheritanceType("JOINED") 
* @DiscriminatorColumn(name="discr", type="string") 
* @DiscriminatorMap({"lttext" = "LTText", "ltstring" = "LTString"}) 
*/ 
abstract class LT { 
    /** 
    * @Id @Column(type="integer") 
    * @GeneratedValue 
    */ 
    private $id; 

    ... 
} 

Тогда я имеют два одинаковых объекта: LTString и LTText:

Entity: LTText

/** 
* @Entity 
*/ 
class LTText extends LT { 

    /** 
    * @Column(type="text") 
    */ 
    private $value; 
} 

Entity: LTString

/** 
* @Entity 
*/ 
class LTText extends LT { 

    /** 
    * @Column(type="string") 
    */ 
    private $value; 
} 

Теперь моя проблема:

Я создаю следующий присоединиться:

$qb = $em->createQueryBuilder(); 
$qb->select('naam') 
    ->from('\TBIT\Entities\Naam', 'naam') //this is the MLT 
    ->leftjoin('naam.languageTerms','lts') //these are the LT's 
    ->orwhere($qb->expr()->like('lts.value',"'%".$word."%'")); 

Теперь, когда последняя строка вызывает у меня проблемы. Он дает ошибку, что lts не имеет поля значений. Это своего рода истина, так как это имеет подкласс. Но как я могу сделать запрос авто включать подкласс?

ответ

0

Вы пытались поставить $value поле в LT классе, как protected доступа:

class LTText extends LT { 

    /** 
    * @Id @Column(type="integer") 
    * @GeneratedValue 
    */ 
    private $id; 

    /** 
    * @Column(type="string") 
    */ 
    private $value; 

} 

Так что, если вам нужно установить $value в другой тип данных просто переписать его в подклассе.

+0

Да, я пробовал это, но затем он удаляет две таблицы подклассов из базы данных. И определение только защищенного значения $ (без @column над ним) не работает. – Thijs

+0

Меня интересует этот сценарий. Я попытаюсь воспроизвести его – manix

0

Я нашел, что могу обойти эту проблему, используя подзапрос. Что-то вроде:

$qb->select('naam') 
    ->from('\TBIT\Entities\Naam', 'naam') //this is the MLT 
    ->where(
     'naam.languageTerms in (SELECT lts FROM [class] lts' 
      .' WHERE ' . $qb->expr()->like('lts.value',"'%".$word."%'") 
     .')' 
    );