首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony2 2/Doctrine: SQL到DQL,用于存储库中的查询生成器,以生成搜索表单

Symfony2 2/Doctrine: SQL到DQL,用于存储库中的查询生成器,以生成搜索表单
EN

Stack Overflow用户
提问于 2015-01-14 22:25:45
回答 2查看 1.5K关注 0票数 1

在我与Symfony的项目中,我需要制作一个多标准的搜索表单。我有实体Parc的选择,实体Typesactivite的选择和集成的输入文本。

我有一个SQL请求:

代码语言:javascript
复制
SELECT distinct e.nom FROM `ensembles` e, `parcsimmobilier` p, `batiments` b, `batiments_typesactivite` bta, `typesactivite` ta WHERE e.parcsimmobilier_id=p.id AND b.ensembles_id=e.id AND bta.batiments_id=b.id AND bta.typesactivite_id = ta.id AND p.nom="Ville de Dijon" AND ta.type="Sport"

这个SQL请求为我提供了属于Dijon parc的所有组件,在这里,batiments有体育促进活动。

我试图用DQL语法在中转换这个SQL请求,但它并没有给我带来好的结果,我想我做错了:

代码语言:javascript
复制
public function recherche($input) //$input est la valeur entrée dans l'input type text recherche
    {
        $qb = $this ->createQueryBuilder('e')
                    ->select('e.nom')
                    ->addSelect('e.parcsimmobilier')
                    ->from('MySpaceDatabaseBundle:Parcsimmobilier', 'p')
                    ->from('MySpaceDatabaseBundle:Typesactivite', 'ta')
                    ->from('MySpaceDatabaseBundle:Batiments', 'b')
                    ->where('e.parcsimmobilier = p.id')
                    ->andWhere('b.ensembles=b.id')
                    ->andWhere('ta.batiments=b.id')
                    ->andWhere('e.nom LIKE :input')
                    ->setParameters(array(
                        'input' => "%".$input."%"));

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

当我提交表格时,我有以下错误:

2/2 QueryException:语义错误第0行,第16行靠近'parcsimmobilier':错误:无效PathExpression。一定是StateFieldPathExpression。 1/2 QueryException:选择e.nom,从MySpace\DatabaseBundle\ e.parcsimmobilier \Ensembles e,MySpaceDatabaseBundle:Parcsimmobilier p,MySpaceDatabaseBundle:Typesactivite ta,MySpaceDatabaseBundle:Batiments b其中e.parcsimmobilier = p.id和b.ensembles=b.id以及ta.batiments=b.id和e.nom :input

如何在存储库中生成DQL请求?

这是我提交的对我的实体群进行搜索的搜索表格:

代码语言:javascript
复制
class RechercheType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            //Parcsimmobilier
            ->add('parcs:', 'entity', array(
                'class' => 'MySpaceDatabaseBundle:Parcsimmobilier', 
                'property' => 'nom', 
                'empty_value' => 'Choisir le parc immobilier', 
                'required' => true))

            //Typesactivite
            ->add('typesactivite:', 'entity', array(
                'class' => 'MySpaceDatabaseBundle:Typesactivite', 
                'property' => 'type', 
                'empty_value' => 'Choisir le type d\'activite', 
                'required' => false))

            //Ensembles
            ->add('ensemble', 'text', array(
                'attr' => array('placeholder' => 'rechercher'), 
                'required' => false))
            ;

更新

这是我的控制器代码,如果可以的话:

代码语言:javascript
复制
public function rechercheEnsemblesAction() {

        $formRecherche = $this->createForm(new RechercheType());

        //si la méthode est bien en POST
        if ($this->get('request')->getMethod() == 'POST' ) 
        {
            $formRecherche->bind($this->get('request'));
            $em=$this->getDoctrine()->getManager();
            $ensemble = $em ->getRepository('MySpaceDatabaseBundle:Ensembles')
                            ->recherche($formRecherche['ensemble']
                            ->getdata());

        }

        return $this->render('MySpaceGestionPatrimoinesBundle:Ensembles:rechercheEnsembles.html.twig', array('ensemble' => $ensemble, 'formRecherche' => $formRecherche->createView() ));
    }

让我们尝试一步一步地执行查询。

在select标记中,我可以选择parcs的名称(表单中的required),不需要在输入文本中输入集合E 227的值。我的SQl请求在phpMyAdmin上

代码语言:javascript
复制
SELECT distinct e.nom  FROM `ensembles` e, `parcsimmobilier` p where e.parcsimmobilier_id=p.id

此请求为提供了属于id 1的parc的所有集成。

在DQl中,我在存储库中进行了尝试

代码语言:javascript
复制
public function recherche() //$input est la valeur entrée dans l'input type text recherche
{
    $qb = $this ->createQueryBuilder('e')
                ->select('e.nom')
                ->from('MySpaceDatabaseBundle:Parcsimmobilier', 'p')
                ->where('e.parcsimmobilier = p.id')
                ->andWhere('e.nom LIKE :input')
                ->setParameters(array(
                    'input' => "%".$input."%"));

    return $qb->getQuery()->getResult();

}

但这并没有给我带来好的结果。结果就是我的数据库中所有的集合,即使我在选择标记中选择了一个parc,在我的构建表单中创建。

有人能一步一步地帮我吗?

如果你需要更多的信息,这就是我的实体之间的关系。只有两个类/实体有我需要的关系。

Ensemnles.php

代码语言:javascript
复制
/**
     * @var \Parcsimmobilier
     *
     * @ORM\ManyToOne(targetEntity="Parcsimmobilier")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="parcsimmobilier_id", referencedColumnName="id")
     * })
     */
    private $parcsimmobilier;

Batiments.php

代码语言:javascript
复制
/**
 * @ORM\ManyToOne(targetEntity="MySpace\DatabaseBundle\Entity\Ensembles")
 * @ORM\JoinColumn(nullable=false)
 */
private $ensembles;

/**
 * @ORM\ManyToMany(targetEntity="MySpace\DatabaseBundle\Entity\Typesactivite")
 * @ORM\JoinColumn(nullable=true)
 */
private $typesactivite;

我真的找不到解决办法,如果你需要的话,可以随时索取更多的信息。

谢谢你的理解。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-16 10:02:33

正如我告诉您的,如果要管理Symfony中的实体,请检查Jquery 这里,看看您的项目。

然后,您可以使用自己的Jquery、Ajax和Symfony请求在html <table>中获得搜索表单的一些结果。

这是一个可以用于datatable中搜索的.js示例:

代码语言:javascript
复制
$(document).ready(function() {
    $('#dataTables').DataTable( {
        "dom": '<"toolbar">frtip',
        responsive: true,
        initComplete: function () {
            var api = this.api();
            api.columns().indexes().flatten().each( function ( i ) {
                var column = api.column( i );
                var select = $('<select><option value=""></option></select>')
                    .appendTo( $(column.footer()).empty() )
                    .on( 'change', function () {
                        var val = $.fn.dataTable.util.escapeRegex(
                            $(this).val()
                        );
                        column
                            .search( val ? '^'+val+'$' : '', true, false )
                            .draw();
                    });
                column.data().unique().sort().each( function ( d, j ) {
                    select.append( '<option value="'+d+'">'+d+'</option>' )
                });
            });
        }
    });
    $("div.toolbar").html('<b>Example</b>');
});

当然,html (不要忘记使用DataTables的表的结构,所有步骤都在文档=> for DataTables中,以便能够增强HTML表,该表必须是有效的,格式良好的HTML,具有头(头)和主体(tbody) )。一个可选的页脚也可以用于。):

代码语言:javascript
复制
<table id="dataTables" class="your class or bootstrap class if you are using bootstrap for example">
    <thead>
        <tr>
            <th>Column 1</th>
            <th>Column 2</th>
            ...number you want...
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>{{ entity.field }}</td>
            <td>{{ entity.field2 }}</td>
            ...etc..
        </tr>
    </tbody>
</table>
票数 1
EN

Stack Overflow用户

发布于 2015-01-14 23:01:12

尝试选择一个具有别名的对象。如果要选择标量字段,请使用select('entity_alias.field'),但如果要选择实体,只需指定表别名。在您的情况下,您需要选择'p‘而不是’e.parcsimMobiler‘。

此外,您应该始终加入,而不是使用多个from语句。这还将允许您根据对象模型的不同,删除那些作为理论连接的where语句,因此不需要手动编写Id = id。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27953594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档