简体   繁体   English

Symfony表单中的自定义查询

[英]Custom Query in Symfony Form

createQueryBuilder Query Working fine Form, when i try to write custom Query using EntityManager its showing warning. createQueryBuilder Query工作正常,当我尝试使用EntityManager编写自定义查询时,显示警告。 EntityManager not available. EntityManager不可用。

Controller : 控制器:

$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 working Fine, but I want to write custom Query using EntityManager, How can I make the entity Equery available here. createQueryBuilder工作正常,但是我想使用EntityManager编写自定义查询,如何在此处使实体Equery可用。 so that I can Run the below Query. 这样我就可以运行以下查询。

$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);

You can use "choices" option for EntityType form, so you just execute query not in query builder but in your form type and result set to choices like 您可以对EntityType表单使用“ choices”选项,因此您只需在表单类型和结果集中选择以下选项即可执行查询:

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

You can inject $em by making the form type a service . 您可以通过使表单类型成为service来注入$em

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

Meanwhile, in our form type: 同时,以我们的表格类型:

// 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!
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM