Symfony2 / Doctrine: SQL to DQL для построителя запросов в репозитории для создания формы поиска

В моем проекте с 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;

Я действительно не могу найти решение, не стесняйтесь спрашивать больше информации, если вам нужно.

Спасибо за ваше понимание.

1

Решение

Как я уже говорил Вот, проверьте таблицы данных 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>
1

Другие решения

Вы пытаетесь выбрать объект с псевдонимом. Если вы хотите выбрать скалярные поля, используйте select('entity_alias.field') но если вы хотите выбрать сущность, вы просто указываете псевдоним таблицы. В вашем случае вам нужно выбрать «p» вместо «e.parcsimmobilier».

Также вы должны всегда присоединяться вместо использования нескольких операторов from. Это также позволит вам отбрасывать те операторы where, которые присоединяются к доктрине, в зависимости от вашей объектной модели, поэтому вам не нужно писать эти Id = id вручную.

1

По вопросам рекламы [email protected]