Я пытаюсь выполнить следующий запрос, используя 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.')');
}
}
Я упростил запрос до следующего, но тогда он выдавал ошибку 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);
@RaymondNijland: Конечно, позвольте мне обновить вопрос.
@RaymondNijland: Я обновил вопрос. Пожалуйста, взгляните на это.
Вам действительно стоит подумать об обновлении
@Mcsky: Да, сейчас мы переписываем весь сайт в Symfony 3.4, но пока он не будет завершен, мы придерживаемся Symfony 1.4.
«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/…
Ой. Поговорим о взрыве из прошлого. Поддерживает ли Doctrine 1 вложенные операторы выбора? У вас есть другой рабочий код с запросами типа «ВЫБРАТЬ все, что из (ВЫБРАТЬ»)? Сообщение об ошибке, похоже, подразумевает, что он ожидает имя класса для значения FROM. Если нет, то я бы разбил запрос на отдельные запросы.
«Сообщение об ошибке, кажется, подразумевает, что ожидает имя класса для значения FROM» Да @Cerad, как я сказал в другом моем комментарии. Переменная $qry - это объект Doctrine_Query, который работает с кодом DQL, а не с кодом SQL.
@Cerad: Не совсем, я не уверен, есть ли другие рабочие примеры.
Есть ли способ заставить его работать с JOINS?
@RaymondNijland Этот вопрос касается Доктрины 1. Полностью отличается от Доктрины 2. Нет DQL.
«Этот вопрос касается Doctrine 1. Полностью отличается от Doctrine 2. Нет DQL» Обратите внимание на URL-ссылку doctrine-project.org/api/doctrine1/latest/Doctrine_Query.htm l @Cerad, в ней есть doctrine1 .. Так что похоже, что Doctrine 1 имеет DQL.
@RaymondNijland Внешний вид может быть обманчивым. Проблема здесь действительно во вложенных операторах выбора. Если вы можете сделать рабочий запрос, то напишите ответ.
Я просто хочу достичь тех же результатов, Query может быть сложным или простым, но сейчас я понятия не имею, как заставить его работать, кроме как с использованием ядра PHP, но я хочу, чтобы он работал с SQL-запросом, а не с PHP .
Не могли бы вы взглянуть на это еще раз?
Вместо передачи объекта Doctrine_Query передайте экземпляр Doctrine_Manager, который является просто объектом PDO. Получите это так: Doctrine_Manager::getInstance()->getCurrentConnection()->getDbh(); С помощью экземпляра PDO вы можете делать необработанные SQL-запросы в виде подготовленных операторов, что, похоже, вы и хотите делать.






Настоящая заслуга принадлежит @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.')');
}
}
}
Предоставьте больше кода PHP, ваш текущий PHP должен по крайней мере показать, как используются переменные ($ qry и $ values). установлены.