在我与Symfony的项目中,我需要制作一个多标准的搜索表单。我有实体Parc的选择,实体Typesactivite的选择和集成的输入文本。
我有一个SQL请求:
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请求,但它并没有给我带来好的结果,我想我做错了:
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请求?
这是我提交的对我的实体群进行搜索的搜索表格:
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))
;更新
这是我的控制器代码,如果可以的话:
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上
SELECT distinct e.nom FROM `ensembles` e, `parcsimmobilier` p where e.parcsimmobilier_id=p.id此请求为提供了属于id 1的parc的所有集成。
在DQl中,我在存储库中进行了尝试
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
/**
* @var \Parcsimmobilier
*
* @ORM\ManyToOne(targetEntity="Parcsimmobilier")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="parcsimmobilier_id", referencedColumnName="id")
* })
*/
private $parcsimmobilier;Batiments.php
/**
* @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;我真的找不到解决办法,如果你需要的话,可以随时索取更多的信息。
谢谢你的理解。
发布于 2015-01-16 10:02:33
正如我告诉您的,如果要管理Symfony中的实体,请检查Jquery 这里,看看您的项目。
然后,您可以使用自己的Jquery、Ajax和Symfony请求在html <table>中获得搜索表单的一些结果。
这是一个可以用于datatable中搜索的.js示例:
$(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) )。一个可选的页脚也可以用于。):
<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>发布于 2015-01-14 23:01:12
尝试选择一个具有别名的对象。如果要选择标量字段,请使用select('entity_alias.field'),但如果要选择实体,只需指定表别名。在您的情况下,您需要选择'p‘而不是’e.parcsimMobiler‘。
此外,您应该始终加入,而不是使用多个from语句。这还将允许您根据对象模型的不同,删除那些作为理论连接的where语句,因此不需要手动编写Id = id。
https://stackoverflow.com/questions/27953594
复制相似问题