Как я могу заставить запрос работать с doctrine1 с помощью Symfony 1.4?

Я пытаюсь выполнить следующий запрос, используя Doctrine 1 с symfony 1.4, но он говорит Couldn't find class (SELECT с 500 Internal Error. Есть ли способ заставить его работать с Doctrine:

SELECT location_id FROM 
(SELECT DISTINCT location_id FROM location_feature_restriction WHERE feature_restriction_id IN(4,15,16)) as t1 
WHERE location_id 
NOT IN(SELECT DISTINCT location_id FROM location_feature_restriction WHERE feature_restriction_id = 5);

Сейчас у меня это так, но не работает:

/**
 * Search for venues with selected features
 * @param Doctrine_Query $qry     The SQL query
 * @param array          $values  The form values
 */
protected function addSearchFeatures(Doctrine_Query $qry, array $values = array()) {
  // "Dry" and "Bespoke Hire" options
  $qryParams = array();
  $qryParts = array();

  if (in_array("bespoke_hire", $values["features"]) && $values["features"][array_search("bespoke_hire", $values["features"])]) {
    $qryParts[] = "q.bespoke_hire = :BESPOKE_HIRE";
    $qryParams["BESPOKE_HIRE"] = 1;
    unset($values["features"][array_search("bespoke_hire", $values["features"])]);
  }
  if (array_key_exists("dry_hire", $values["features"]) && $values["features"][array_search("dry_hire", $values["features"])]) {
    $qryParts[] = "q.dry_hire = :DRY_HIRE";
    $qryParams["DRY_HIRE"] = 1;
    $values["features"][array_search("dry_hire", $values["features"])];
  }
  if (count($qryParts)) {
    $qry->andWhere(implode(" OR ", $qryParts), $qryParams);
  }

  // Search for selected features
  if (count($values["features"])) {
    // If anyone need to features should be searched using the OR condition then comment having condtion from following line.
    if ($values["no_noise_restrictions"]) {
      $subSql = "SELECT location_id FROM 
                (SELECT DISTINCT location_id FROM LocationFeatureRestriction WHERE feature_restriction_id IN(".implode(',', $values["features"]).")) as t1 
                WHERE location_id 
                NOT IN(SELECT DISTINCT location_id FROM LocationFeatureRestriction WHERE feature_restriction_id = 5)";
    } else {
      $subSql = "SELECT LocationFeatureRestriction.location_id 
         FROM LocationFeatureRestriction
         WHERE feature_restriction_id IN(".implode(',', $values["features"]).")
         GROUP BY location_id
         HAVING COUNT(DISTINCT feature_restriction_id) = ".count($values['features']);
    }

    $qry->andWhere('q.id IN ('.$subSql.')');
  }
}

Ошибка доктрины: Как я могу заставить запрос работать с doctrine1 с помощью Symfony 1.4?Обновлено:

Я упростил запрос до следующего, но тогда он выдавал ошибку Couldn't get short alias for:

SELECT DISTINCT location_id FROM location_feature_restriction 
WHERE location_id NOT IN 
(SELECT DISTINCT location_id FROM location_feature_restriction 
WHERE feature_restriction_id = 5);

Затем продолжил и добавил псевдоним для таблицы, но теперь он выдает ошибку Couldn't find class featureTable:

SELECT DISTINCT location_id FROM location_feature_restriction 
WHERE location_id NOT IN 
(SELECT DISTINCT location_id FROM location_feature_restriction AS featureTable
WHERE featureTable.feature_restriction_id = 5);

Предоставьте больше кода PHP, ваш текущий PHP должен по крайней мере показать, как используются переменные ($ qry и $ values). установлены.

Raymond Nijland 24.08.2018 14:34

@RaymondNijland: Конечно, позвольте мне обновить вопрос.

Umair Shah Yousafzai 24.08.2018 14:35

@RaymondNijland: Я обновил вопрос. Пожалуйста, взгляните на это.

Umair Shah Yousafzai 24.08.2018 14:36

Вам действительно стоит подумать об обновлении

Mcsky 24.08.2018 14:37

@Mcsky: Да, сейчас мы переписываем весь сайт в Symfony 3.4, но пока он не будет завершен, мы придерживаемся Symfony 1.4.

Umair Shah Yousafzai 24.08.2018 14:38

«protected function addSearchFeatures(Doctrine_Query $qry» -> «Doctrine_Query Объект Doctrine_Query представляет запрос DQL. Он используется для запроса данных в базах данных объектно-ориентированным способом. Запрос DQL понимает отношения и наследование и не зависит от dbms». (doctrine-project.org/api/doctrine1/latest/Doctrine_Query.htm‌ l) То, что у вас есть, не является запросом DQL, а обычным запросом SQL ... в запросе DQL обычные имена таблиц SQL должны быть именами объектов. -> doctrine-project.org/projects/doctrine-orm/en/2.6/reference/‌…

Raymond Nijland 24.08.2018 14:42

Ой. Поговорим о взрыве из прошлого. Поддерживает ли Doctrine 1 вложенные операторы выбора? У вас есть другой рабочий код с запросами типа «ВЫБРАТЬ все, что из (ВЫБРАТЬ»)? Сообщение об ошибке, похоже, подразумевает, что он ожидает имя класса для значения FROM. Если нет, то я бы разбил запрос на отдельные запросы.

Cerad 24.08.2018 14:43

«Сообщение об ошибке, кажется, подразумевает, что ожидает имя класса для значения FROM» Да @Cerad, как я сказал в другом моем комментарии. Переменная $qry - это объект Doctrine_Query, который работает с кодом DQL, а не с кодом SQL.

Raymond Nijland 24.08.2018 14:46

@Cerad: Не совсем, я не уверен, есть ли другие рабочие примеры.

Umair Shah Yousafzai 24.08.2018 14:49

Есть ли способ заставить его работать с JOINS?

Umair Shah Yousafzai 24.08.2018 14:50

@RaymondNijland Этот вопрос касается Доктрины 1. Полностью отличается от Доктрины 2. Нет DQL.

Cerad 24.08.2018 14:50

«Этот вопрос касается Doctrine 1. Полностью отличается от Doctrine 2. Нет DQL» Обратите внимание на URL-ссылку doctrine-project.org/api/doctrine1/latest/Doctrine_Query.htm‌ l @Cerad, в ней есть doctrine1 .. Так что похоже, что Doctrine 1 имеет DQL.

Raymond Nijland 24.08.2018 14:56

@RaymondNijland Внешний вид может быть обманчивым. Проблема здесь действительно во вложенных операторах выбора. Если вы можете сделать рабочий запрос, то напишите ответ.

Cerad 24.08.2018 15:01

Я просто хочу достичь тех же результатов, Query может быть сложным или простым, но сейчас я понятия не имею, как заставить его работать, кроме как с использованием ядра PHP, но я хочу, чтобы он работал с SQL-запросом, а не с PHP .

Umair Shah Yousafzai 24.08.2018 15:11

Не могли бы вы взглянуть на это еще раз?

Umair Shah Yousafzai 24.08.2018 16:37

Вместо передачи объекта Doctrine_Query передайте экземпляр Doctrine_Manager, который является просто объектом PDO. Получите это так: Doctrine_Manager::getInstance()->getCurrentConnection()->get‌​Dbh(); С помощью экземпляра PDO вы можете делать необработанные SQL-запросы в виде подготовленных операторов, что, похоже, вы и хотите делать.

Kris Peeling 24.08.2018 23:38
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
16
270
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Настоящая заслуга принадлежит @Kris Peeling, потому что он привлек мое внимание к этой идее!

Похоже, мне просто нужно было получить массив идентификаторов, поэтому я использовал Doctrine_Manager (PDO) для выполнения работы.

Вот что я сделал, чтобы выполнить свою работу:

if (isset($arrValues['features']) && count($arrValues['features']) > 0) {
  $this->addSearchFeatures($qry, $arrValues);
} else {
  if ($arrValues['no_noise_restrictions']) {
    $subQuery = "SELECT DISTINCT LocationFeatureRestriction.location_id FROM LocationFeatureRestriction WHERE feature_restriction_id = 5";
    $qry->andWhere('q.id NOT IN ('.$subQuery.')');
  }
}

/**
 * Search for venues with selected features
 * @param Doctrine_Query $qry     The SQL query
 * @param array          $values  The form values
 */
protected function addSearchFeatures(Doctrine_Query $qry, array $values = array()) {
  // "Dry" and "Bespoke Hire" options
  $qryParams = array();
  $qryParts = array();

  if (in_array("bespoke_hire", $values["features"]) && $values["features"][array_search("bespoke_hire", $values["features"])]) {
    $qryParts[] = "q.bespoke_hire = :BESPOKE_HIRE";
    $qryParams["BESPOKE_HIRE"] = 1;
    unset($values["features"][array_search("bespoke_hire", $values["features"])]);
  }
  if (array_key_exists("dry_hire", $values["features"]) && $values["features"][array_search("dry_hire", $values["features"])]) {
    $qryParts[] = "q.dry_hire = :DRY_HIRE";
    $qryParams["DRY_HIRE"] = 1;
    $values["features"][array_search("dry_hire", $values["features"])];
  }
  if (count($qryParts)) {
    $qry->andWhere(implode(" OR ", $qryParts), $qryParams);
  }

  // Search for selected features
  if (count($values["features"])) {
    // If anyone need to features should be searched using the OR condition then comment having condtion from following line.

    // When No Noise Restrictions is checked in Licensing Category
    if ($values['no_noise_restrictions']) {
      $subSql = "SELECT DISTINCT location_id FROM location_feature_restriction WHERE feature_restriction_id IN(".implode(',', $values["features"]).") AND location_id NOT IN (SELECT DISTINCT location_id FROM location_feature_restriction WHERE feature_restriction_id = 5)";

      $connection = Doctrine_Manager::connection();
      $statement = $connection->execute($subSql);
      $statement->execute();
      $resultset = $statement->fetchAll(PDO::FETCH_ASSOC);
      $location_ids = array();
      foreach ($resultset as $each) {
        $location_ids[] = $each['location_id'];
      }

      if (count($location_ids)) {
        $qry->andWhere('q.id IN ('.implode(',', $location_ids).')');
      } else {
        $qry->andWhere('q.id IN (0)');
      }
    } else {
      // Otherwise check for the normal features
      $subSql = "SELECT LocationFeatureRestriction.location_id 
                 FROM LocationFeatureRestriction
                 WHERE feature_restriction_id IN(".implode(',', $values["features"]).")
                 GROUP BY location_id
                 HAVING COUNT(DISTINCT feature_restriction_id) = ".count($values['features']);
      $qry->andWhere('q.id IN ('.$subSql.')');
    }

  }
}

Другие вопросы по теме