Symfony2 и Doctrine2: используйте результат класса Repository в классе Type

У меня есть 5 сущностей:

  1. принадлежность
  2. Человек
  3. Пользователь
  4. Принадлежность пользователя
  5. ЛицоПринадлежность

Моя цель — отобразить список полей выбора, где я могу выбрать все UserAffiliations, которых нет в PersonAffiliations.

Моя идея состоит в том, чтобы создать общедоступную функцию в UserAffiliationRepository, которая будет возвращать только те связи для конкретного пользователя, которые не заданы для конкретного человека.

Для этого я использую:

class UserAffiliationRepository extends EntityRepository
{ 
   public function getUnselectedAffiliations( $user_id = null, $person_id = null )
   {
      $commQB = $this->createQueryBuilder( 'ua' )
      ->select('ua');

      $commQB->where("ua.user_id = {$user_id}");

      $commQB->andWhere( "ua.affiliation_id not in ( select pa.affiliation_id  FROM SciForumVersion2Bundle:PersonAffiliation pa where pa.person_id = 3077 )" );

      return $commQB->getQuery()->getResult();
   }
}

И это прекрасно работает.

Теперь я хотел бы использовать этот результат в FormBuilder. Для этого в моем контроллере я использую:

$affiliations = $em->getRepository('SciForumVersion2Bundle:UserAffiliation')->getUnselectedAffiliations($user->getId(), $author->getId())
$enquiry    = new PersonAffiliation();
$formType   = new SubmissionAffiliationAddFormType($user, $affiliations);
$form   = $this->createForm($formType, $enquiry);

И затем в классе Form я использую:

$builder->add('affiliation', 'entity', array(
            'class' => 'SciForumVersion2Bundle:UserAffiliation',
            'multiple' => true));

Но здесь я получаю все связи для конкретного пользователя, а не только те, которых еще нет в сущности PersonAffiliations.

Любая помощь? Спасибо.


person Milos Cuculovic    schedule 27.11.2012    source источник


Ответы (1)


Вы должны перенести свою функцию getUnselectedAffiliations непосредственно в entity_type следующим образом.

$builder->add('affiliation', 'entity', array(
            'class' => 'SciForumVersion2Bundle:UserAffiliation',
            'multiple' => true,
            'query_builder' = function(EntityRepository $repo) use ($yourParameters){
                               return $repo->createQueryBuilder(....);}));

если вы хотите передать $yourParameters, вы должны сделать это в функцию __construct (реализовать ее, если у вас ее нет), и когда вы создаете свою форму, вы можете передать их по вызовам

person DonCallisto    schedule 27.11.2012
comment
Спасибо @DonCallisto. Да, у меня есть функция _construct, и я могу получить все необходимые параметры. Я попробую ваше решение прямо сейчас. - person Miloš; 27.11.2012
comment
Хм, первая проблема, как получить доступ к getUnselectedAffiliations в классе entity_type? Что я должен указать в createQueryBuilder(....) Спасибо. - person Miloš; 27.11.2012
comment
@Milos, у вас нет доступа к нему напрямую в entity_type: вам нужно переместить код, который у вас есть, в эту функцию на createQuerybuilder(....) [замените точки] - person DonCallisto; 27.11.2012
comment
ах ок, а запрос из репозитория напрямую в типе сущности получить нельзя? - person Miloš; 27.11.2012
comment
@Milos Я игнорирую эту возможность. Я предполагаю, что если в учебниках говорится, что вам нужно написать DQL или создать QueryBuilder непосредственно в вашем entity_type, возможно, это единственное и лучшее решение. Но я не могу поспорить на это :) (вы должны повторно использовать этот фрагмент кода в другом месте?) - person DonCallisto; 27.11.2012
comment
Спасибо. Затем я перенесу код в класс entity_type. На данный момент нет, мне не нужно повторно использовать этот код, но я подумал, что, возможно, в будущем я это сделаю, поэтому я начал с того, что поместил его в репозиторий. Я попробую ваше решение, и если оно сработает, я приму ответ, если нет, я скоро вернусь к вам. - person Miloš; 27.11.2012