如何使用 symfony 1.4 使查询与 doctrine1 一起工作?
How can I make the query work with doctrine1 using symfony 1.4?
我正在尝试使用 Doctrine 1 和 symfony 1.4 运行 以下查询,但它说 Couldn't find class (SELECT
有 500 个内部错误。有什么方法可以让它与 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.')');
}
}
学说错误:
更新:
我已将查询简化为以下内容,但随后出现错误 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);
然后继续为 table 添加别名,但现在出现错误 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);
真正的功劳归于@Kris Peeling,因为他让我注意到了这个想法!
似乎我只需要获取 ID 数组,所以我使用 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.')');
}
}
}
我正在尝试使用 Doctrine 1 和 symfony 1.4 运行 以下查询,但它说 Couldn't find class (SELECT
有 500 个内部错误。有什么方法可以让它与 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.')');
}
}
学说错误:
我已将查询简化为以下内容,但随后出现错误 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);
然后继续为 table 添加别名,但现在出现错误 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);
真正的功劳归于@Kris Peeling,因为他让我注意到了这个想法!
似乎我只需要获取 ID 数组,所以我使用 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.')');
}
}
}