Как я могу заставить запрос работать с doctrine1, используя symfony 1.4? - PullRequest
0 голосов
/ 24 августа 2018

Я пытаюсь выполнить следующий запрос, используя 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.')');
  }
}

Ошибка доктрины: enter image description here UPDATE:

Я упростил запрос до следующего, но тогда он выдавал ошибку 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);

1 Ответ

0 голосов
/ 25 августа 2018

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

Похоже, мне просто нужно было получить массив идентификаторов, поэтому я использовал 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.')');
    }

  }
}
...