代码之家  ›  专栏  ›  技术社区  ›  Umair Shah

如何使用symfony 1.4使查询与doctrine1一起工作?

  •  1
  • Umair Shah  · 技术社区  · 7 年前

    Couldn't find class (SELECT 有500个内部错误。我有没有办法让它和教义一起工作:

    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 更新:

    我已将查询简化为以下内容,但随后出现了错误 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 回复  |  直到 7 年前
        1
  •  0
  •   Umair Shah    7 年前

    真正的功劳是 @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.')');
        }
    
      }
    }