выберите сущности нескольких подклассов, расширяющихся из одного суперкласса, используя доктрину 2 - PullRequest
5 голосов
/ 06 марта 2012

Учитывая эту настройку для моей сущности Doctrine 2:

App\Bundle\LorumBundle\Entity\Node:
  type: entity
  table: node
  fields:
    id:
      id: true
      type: integer
      unsigned: false
      nullable: false
      generator:
        strategy: IDENTITY

    created:
      type: datetime

  inheritanceType: SINGLE_TABLE

  discriminatorColumn:
    name: type
    type:  string
    length: 255
  discriminatorMap:
    a: a
    b: b
    c: c

App\Bundle\LorumBundle\Entity\A:
  type: entity

  fields:
    status:
      type: boolean

App\Bundle\LorumBundle\Entity\B:
  type: entity

  fields:
    status:
      type: boolean

App\Bundle\LorumBundle\Entity\C:
  type: entity

  fields:
    title:
      type: string

Теперь я хочу получить смешанный список сущностей типа A & B (не C) с status == true.

Я мог бы написать такой запрос - используя оператор instance of, чтобы ограничить результат только теми подклассами, которые я хочу, но я получу ошибку, потому что свойство, с которым я хочу сопоставить (статус), не отображается в Суперкласс, даже у всех сущностей, с которыми я хочу сравниться, есть:

$queryBuilder->select('Node');
$queryBuilder->from('App\Bundle\LorumBundle\Entity\Node','Node');
$queryBuilder->add('where',$queryBuilder->expr()->orx(
        'Offer INSTANCE OF AppLorumBundle:A',
        'Offer INSTANCE OF AppLorumBundle:B'
));
$queryBuilder->where($queryBuilder->expr()->eq('Node.status', '?1'));
$queryBuilder->setParameter(1, true);
$queryBuilder->orderBy('Node.created', 'asc');
$queryBuilder->setFirstResult( 0 );
$queryBuilder->setMaxResults( 200 );

Есть ли способ сделать это, кроме как написать свой собственный персистер и взломать его в Doctrine2?

К сожалению, я не могу просто добавить информацию в суперкласс (в моем реальном сценарии эта ситуация в основном относится к отношениям, которые я не хочу загружать с каждым подклассом)

1 Ответ

1 голос
/ 11 марта 2012

Вы можете использовать UNION и работать с запросами для сущностей A и B

  • запрос на построение для объекта A
  • запрос на построение для объекта B
  • запрос на построение лимита и порядка с использованием UNION для запросов A и B

нет необходимости делать какие-либо хаки для библиотеки Doctrine

...