Автор Тема: Как создать составной запрос к базе данных в Zend Framework 2  (Прочитано 396 раз)

0 Пользователей и 1 Гость смотрят эту тему.

Оффлайн AnastasiaK

  • Участник форума
  • Сообщений: 6
  • Карма: 0
Поиск в базе данных осуществляется по разным критериям, следовательно к каждому столбцу применяются разные условия. Например в базе есть поле год. Поиск по полю "год" осуществляется как поиск за период. То есть, пользователь указывает "год начала" и "год конца", затем должны выводиться документы которые попадают в этот период. Помимо этого пользователь вводит название раздела документа, который я также передаю в поисковую функцию.

public function getFinal_descriptionssearch($paginated=false,$searchList)
     {
      if (
$paginated) {
       
$select = new Select('books');
       
$resultSetPrototype = new ResultSet();
       
$resultSetPrototype->setArrayObjectPrototype(new Book());
       
$paginatorAdapter = new DbSelect(
       
$select->where($searchList)->order('iid ASC'),
       
$this->tableGateway->getAdapter(),
       
$resultSetPrototype
       
);
       
$paginatorF = new Paginator($paginatorAdapter);
       return 
$paginatorF;}
         
$rowset $this->tableGateway->select();
              return 
$rowset;
     }

На данном этапе получилось реализовать поиск только если поле равно (=) критерию поиска. А нужно чтобы оно было больше (>) либо меньше (<).
Как совместить в SQL запросе поиск с различными условиями. Составить просто статический SQL запрос?
Вроде такого:

SELECT 
FROM books WHERE (
(
discipline 'searchlist[1]'
AND 
(
year BETWEEN 'searchList['year_start']' AND searchList['year_end']));

Оффлайн KaiL

  • Участник форума
  • Сообщений: 29
  • Карма: 3
Здравствуйте!
Для начала советую ознакомится с документацией: https://zendframework.github.io/zend-db/sql/#where-having.
Для создания динамических условий выборки используйте классы в пространстве имён \Zend\Db\Sql\Predicate. Например, Ваш SQL-запрос
SELECT FROM books WHERE (
(
discipline 'searchlist[1]'
AND 
(
year BETWEEN 'searchList['year_start']' AND searchList['year_end']));
можно реализовать так:
use Zend\Db\Sql\Predicate\Between;
use 
Zend\Db\Sql\Predicate\Operator;
use 
Zend\Db\Sql\Predicate\PredicateSet;
use 
Zend\Db\Sql\Select;
use 
Zend\Db\Sql\Where;

$select = new Select('books');
$where = new Where();
$where->addPredicate(new Operator('discipline'Operator::OPERATOR_EQUAL_TO$searchList[1]));
$where->addPredicate(new Between('year'$searchList['year_start'], $searchList['year_end']));
$select->where($where);

echo 
$select->getSqlString($adapter->getPlatform());

Оффлайн AnastasiaK

  • Участник форума
  • Сообщений: 6
  • Карма: 0
Здравствуйте!
Для начала советую ознакомится с документацией: https://zendframework.github.io/zend-db/sql/#where-having.
Для создания динамических условий выборки используйте классы в пространстве имён \Zend\Db\Sql\Predicate. Например, Ваш SQL-запрос
SELECT FROM books WHERE (
(
discipline 'searchlist[1]'
AND 
(
year BETWEEN 'searchList['year_start']' AND searchList['year_end']));
можно реализовать так:
use Zend\Db\Sql\Predicate\Between;
use 
Zend\Db\Sql\Predicate\Operator;
use 
Zend\Db\Sql\Predicate\PredicateSet;
use 
Zend\Db\Sql\Select;
use 
Zend\Db\Sql\Where;

$select = new Select('books');
$where = new Where();
$where->addPredicate(new Operator('discipline'Operator::OPERATOR_EQUAL_TO$searchList[1]));
$where->addPredicate(new Between('year'$searchList['year_start'], $searchList['year_end']));
$select->where($where);

echo 
$select->getSqlString($adapter->getPlatform());


Здравствуйте! Спасибо большое! Просто не доходило, что можно несколько раз добавлять предикаты в Where. Теперь понятно!

Оффлайн AnastasiaK

  • Участник форума
  • Сообщений: 6
  • Карма: 0
Здравствуйте!
Для начала советую ознакомится с документацией: https://zendframework.github.io/zend-db/sql/#where-having.
Для создания динамических условий выборки используйте классы в пространстве имён \Zend\Db\Sql\Predicate. Например, Ваш SQL-запрос
SELECT FROM books WHERE (
(
discipline 'searchlist[1]'
AND 
(
year BETWEEN 'searchList['year_start']' AND searchList['year_end']));
можно реализовать так:
use Zend\Db\Sql\Predicate\Between;
use 
Zend\Db\Sql\Predicate\Operator;
use 
Zend\Db\Sql\Predicate\PredicateSet;
use 
Zend\Db\Sql\Select;
use 
Zend\Db\Sql\Where;

$select = new Select('books');
$where = new Where();
$where->addPredicate(new Operator('discipline'Operator::OPERATOR_EQUAL_TO$searchList[1]));
$where->addPredicate(new Between('year'$searchList['year_start'], $searchList['year_end']));
$select->where($where);

echo 
$select->getSqlString($adapter->getPlatform());


Попробовала реализовать. Все равно работает только с одним предикатом, при добавлении второго не работает ни одно, ни второe условие.

Оффлайн KaiL

  • Участник форума
  • Сообщений: 29
  • Карма: 3
Чтобы понять, почему Ваш код не работает, нужно на него посмотреть.???
Прикрепите, пожалуйста, фрагмент неработающего кода.