В моем проекте с 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-запрос дает мне все ансамбли, которые принадлежат парку Дижон, где у баттлов есть Спорт для активности.
Я пытался преобразовать этот запрос SQL в DQL синтаксис в моем EnsemblesRepository.php, но он не дает мне хороший результат, я думаю, что я делаю это неправильно:
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’: ошибка: неверное выражение пути. Должно быть
StateFieldPathExpression. [1/2] QueryException: ВЫБЕРИТЕ e.nom, e.parcsimmobilier FROM
MySpace \ DatabaseBundle \ Entity \ Ensembles e,
MySpaceDatabaseBundle: Parcsimmobilier p,
MySpaceDatabaseBundle: Typesactivite ta,
MySpaceDatabaseBundle: Batiments b WHERE e.parcsimmobilier = p.id AND
b.ensembles = b.id AND ta.batiments = b.id AND e.nom LIKE: ввод
Как я могу сделать запрос 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() ));
}
Давайте попробуем сделать запрос шаг за шагом.
В Выбрать тег, я могу выбрать название парков (требуется в моей форме), без введите значение в мой текст ввода для имени ансамбль.
мой SQl запрос на PhpMyAdmin:
SELECT distinct e.nom FROM `ensembles` e, `parcsimmobilier` p where e.parcsimmobilier_id=p.id
Этот запрос дает мне весь ансамбльпринадлежность к парк с идентификатором 1.
В DQL, Я пытаюсь это в моем хранилище EnsemblesRepository.php:
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();
}
Но это не возвращает мне хороший результат. В результате вся база данных Ensemble в моей базе данных, даже если я выбрал парк в своем теге select create в моей сборочной форме.
Кто-то может помочь мне шаг за шагом?
Если вам нужна дополнительная информация, это связь между моими сущностями. Только два класса / сущности имеют отношение, которое мне нужно.
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;
Я действительно не могу найти решение, не стесняйтесь спрашивать больше информации, если вам нужно.
Спасибо за ваше понимание.
Как я уже говорил Вот, проверьте таблицы данных Jquery Вот, для вашего проекта, если это для управления вашими сущностями в Symfony.
Затем вы можете использовать свой собственный запрос с Jquery, Ajax и Symfony, чтобы получить некоторые результаты для формы поиска в HTML <table>
,
Это пример .js
Вы можете использовать для поиска в datatable:
$(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, все шаги в документе => Чтобы DataTables могли расширять таблицу HTML, таблица должна быть корректной, хорошо отформатированным HTML, с заголовком (thead) и телом (tbody). Также можно использовать дополнительный нижний колонтитул (tfoot).):
<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>
Вы пытаетесь выбрать объект с псевдонимом. Если вы хотите выбрать скалярные поля, используйте select('entity_alias.field')
но если вы хотите выбрать сущность, вы просто указываете псевдоним таблицы. В вашем случае вам нужно выбрать «p» вместо «e.parcsimmobilier».
Также вы должны всегда присоединяться вместо использования нескольких операторов from. Это также позволит вам отбрасывать те операторы where, которые присоединяются к доктрине, в зависимости от вашей объектной модели, поэтому вам не нужно писать эти Id = id вручную.