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