2017-02-16 2 views
0

createQueryBuilder Query Working fine Form, когда я пытаюсь написать пользовательский запрос с использованием EntityManager с его предупреждением. EntityManager недоступен.Пользовательский запрос в форме Symfony

Контроллер:

$form = $this->createForm(new ContractsType($user, $isAdmin, $securityContext), $contract, array('em' => $em, 'referring_student' => $contract->getReferringStudent())); 

ContractsType

class ContractsType extends AbstractType { 

$queryBuilder = function($repo) use ($user) { 

return $repo->createQueryBuilder('p') 
    ->leftJoin('p.employees', 'e') 
    ->where('e.id = :employee_id') 
    ->setParameter('employee_id', $user->getId()) 
    ->orderBy('p.name', 'ASC'); 
} 
    $builder->add('store', 'entity', array(
     'class' => 'C2EducateToolsBundle:Stores', 
     'label' => 'Center', 
     'query_builder' => $queryBuilder, 
     'property' => 'name', 
     'empty_value' => 'Select') 
    ); 
    } 

createQueryBuilder работает отлично, но я хочу, чтобы написать пользовательский запрос, используя EntityManager, Как я могу сделать объект Equery доступны здесь. так что я могу запустить ниже запрос.

$storesQuery = "select store_id as id,ts.name as name from tbl_employees e LEFT JOIN tbl_stores ts ON e.store_id=ts.id where e.id=:employeesId AND ts.center_type_id!=:centerTypeId AND ts.select_option = :selectOption"; 
      $em = $this->getDoctrine()->getEntityManager(); 
      $stmt = $em->getConnection()->prepare($storesQuery); 
      $stmt->bindValue('employeesId', $user->getId()); 
      $stmt->execute(); 
      $listLocations = $stmt->fetchAll(\PDO::FETCH_ASSOC); 
+0

Произвольный [репозиторий класса] (http://symfony.com/doc/current/doctrine/repository.html)? – Unflux

+0

Вы могли решить вашу проблему? – Rhono

ответ

1

Вы можете вводить $em по делая form type a service.

# myBundle\config\services.yml 
services: 
    form.type.address: 
     class: myBundle\Form\AddressType 
     arguments: ['@doctrine.orm.entity_manager'] # We inject our familiar $em. 

Между тем, в нашем типе формы:

// myBundle\Form\AddressType.php 
// ... 
Class AddressType 
{ 
    protected $em; 

    public function __construct(\Doctrine\ORM\EntityManager $em) // Type-hint so nothing funny gets in. 
    { 
     $this->em = $em; // And store it on our form type during instantiation. 
    } 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     // ... Then use it in here! 
    } 
} 
1

Вы можете использовать «выбор» вариант для EntityType формы, так что вы просто выполнить запрос не в построитель запросов, но в вашем типе формы и привести набор к выбору как

$query = ....; 
$result = $query->execute(); 
$builder->add('store', 'entity', array(
    'class' => 'C2EducateToolsBundle:Stores', 
    'label' => 'Center', 
    'choices' => $result, 
    'property' => 'name', 
    'empty_value' => 'Select') 
); 
+0

Да, вы правы, я хочу написать запрос и передать результаты, но проблема в Entity Manager там недоступна, как я могу настроить это.? – Developer

+1

Я думал, что вы уже используете его, потому что вы передаете $ em в опции, поэтому вы можете получить em с помощью $ em = $ options ['em']; Или вы можете передать их в службу, как в ответ @Rhono –

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