2017-01-11 3 views
0

У меня есть 2 Entities: Компания и пользователей, которые имеют ссылку company_user ManyToManyФорма Dynamic Symfony2 ManyToMany

Я хотел бы, чтобы иметь возможность просмотреть список компаний, связанных с подключенным пользователем.

Так что вслед за этим: http://symfony.com/doc/current/form/dynamic_form_modification.html#form-events-user-data

Однако в моей просьбе, я не могу отобразить компанию, связанную с пользователем.

Вот мой CompanyRepo

<?php 

namespace BudgetBundle\Repository; 

use Doctrine\ORM\EntityRepository; 

/** 
* CompanyRepository 
* 
* This class was generated by the Doctrine ORM. Add your own custom 
* repository methods below. 
*/ 
class CompanyRepository extends EntityRepository 
{ 
    public function companyByUser($user){ 


    return $qb = $this->createQueryBuilder('cr') 

      ->where('cr.id = :user') 
      ->setParameter('user', $user); 



    } 
} 

Мой FOrmType

public function buildForm(FormBuilderInterface $builder, array $options) 
    { 


     // grab the user, do a quick sanity check that one exists 
     $user = $this->tokenStorage->getToken()->getUser(); 
     if (!$user) { 
      throw new \LogicException(
       'The FriendMessageFormType cannot be used without an authenticated user!' 
      ); 
     } 

     $builder->addEventListener(
      FormEvents::PRE_SET_DATA, 
      function (FormEvent $event) use ($user) { 
       $form = $event->getForm(); 

       $formOptions = array(
        'class'   => Company::class, 
        'property'  => 'name', 
        'query_builder' => function (CompanyRepository $er) use ($user) { 
         // build a custom query 
         // return $er->createQueryBuilder('u')->addOrderBy('fullName', 'DESC'); 
       return $er->companyByUser($user); 
         // or call a method on your repository that returns the query builder 
         // the $er is an instance of your UserRepository 
         // return $er->createOrderByFullNameQueryBuilder(); 
        }, 
       ); 

       // create the field, this is similar the $builder->add() 
       // field name, field type, data, options 
       $form->add('company', EntityType::class, $formOptions); 
      } 
     ); 
    } 

И мой контроллер

public function addDebitAction(Request $request) { 

    $em = $this->getDoctrine()->getManager(); 
    $debit = new Debit(); 
    $form = $this->createForm(DebitType::class, $debit); 

    $amountCapital = $em->getRepository('BudgetBundle:Capital')->find($this->getUser()); 



    if ($request->isMethod('POST') && $form->handleRequest($request)->isValid()) { 

     $em = $this->getDoctrine()->getManager(); 
     $capital = $em->getRepository('BudgetBundle:Capital')->findOneBy([ 'user' => $this->getUser()->getId() ]); 




     if ($capital == false){ 
      $this->get('session')->getFlashBag()->set('error', 'Vous devez avoir un capital de départ, merci d\'en ajouter un !'); 
      return $this->redirectToRoute('budget_add_gain'); 
     } 



     else{ 

      $capital->setTotalDebits($capital->getTotalDebits() + $debit->getAmount()); 
      $amountCapital->setAmount($amountCapital->getAmount() - $debit->getAmount()); // MEt a jout le capital 
     } 



     $em = $this->getDoctrine()->getManager(); 
     $debit->setUser($this->getUser()); 
     $em->persist($debit); 


     $em->flush(); 
     $request->getSession()->getFlashBag()->add('success', 'Debit Added !'); 

     return $this->redirectToRoute('budget_homepage'); 

    } 


    return $this->render('@Budget/Views/company/debit.html.twig', [ 'form' => $form->createView() ]); 


} 

ответ

0

Попробуйте это:

public function companyByUser($user){ 
     return $this->createQueryBuilder('cr') 
      ->innerJoin('cr.users', 'u', 'WITH', 'u = :user') 
      ->setParameter('user', $user); 
    } 

Вам также необходимо установить значение choice_label в построителе запросов в типе формы. Что-то вроде:

choice_label => 'company_name' 

Я не знаю, что ваша компания и пользовательские поля являются лица, поэтому убедитесь, что вы замените users и company_name с правильными именами полей.

+0

Он работал с этим -> 'со $ дь = $ this-> createQueryBuilder ('а') -> LeftJoin ('cr.user', 'Cruser') -> addSelect ('Cruser') -> где ('cruser.id =: user') -> setParameter ('пользователь', $ пользователь); ' de' – Emnoze

Смежные вопросы