У меня есть таблица, в которой существует столбец, в котором различные значения являются stored.i, хотят получить уникальные значения от той таблицы с помощью dql.
Doctrine_Query::create()
->select('rec.school')
->from('Records rec')
->where("rec.city='$city' ")
->execute();
Теперь я хочу только уникальные значения. Может кто-либо говорить мне, как сделать это...
Править
Структура таблицы:
CREATE TABLE IF NOT EXISTS `records` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`state` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`city` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`school` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=16334 ;
Это - Запрос, который я использую:
Doctrine_Query::create()
->select('DISTINCT rec.city')
->from('Records rec')
->where("rec.state = '$state'")
// ->getSql();
->execute();
Generting Sql для этого дает мне:
SELECT DISTINCT r.id AS r__id, r.city AS r__city FROM records r WHERE r.state = 'AR'
Теперь проверьте, что sql генерировал:::: ОТЛИЧНЫЙ, находится на 'идентификационном' столбце где, как я хочу Отличный на городском столбце. Кто-либо знает, как зафиксировать это.
EDIT2
Идентификатор является уникальной причиной автоматическое возрастающее значение. Ya у меня есть некоторые реальные дубликаты в городском столбце как: Дели и Дели.Правильно.. Теперь, когда я пытаюсь выбрать данные из него, я получаю Дели два раза. Как может я делать запрос как это:
select DISTINCT rec.city where state="xyz";
Вызовите это даст мне надлежащий вывод.
EDIT3:
Кто-либо, кто может сказать мне, как выяснить этот запрос..???
Повторный ответ:
Проверили это на моем локальном компьютере - не сработало. Поэтому позвольте мне посоветовать использовать PDO до тех пор, пока это не будет улучшено или исправлено:
$dbh = Doctrine_Manager::connection()->getDbh();
$stmt = $dbh->prepare('SELECT DISTINCT(rec.city) FROM <tablename> WHERE rec.state = :state');
$stmt->bindParam(':state', $state);
$stmt->execute();
$result = $stmt->fetchAll();
Совет
Я бы порекомендовал вам использовать -иностранный ключ со ссылкой на список городов в колонке city
вместо простого текста для гибкости и лучшей производительности.
Для этого можно использовать класс Raw_Sql . Вот тест, который я только что выполнил для своей собственной базы данных:
<?php
set_include_path(get_include_path() . PATH_SEPARATOR . 'library');
require('Doctrine.php');
spl_autoload_register(array('Doctrine', 'autoload'));
Doctrine::loadModels('application/models/generated');
Doctrine::loadModels('application/models');
$dm=Doctrine_Manager::getInstance();
$conn = $dm->openConnection("mysql://dbuser:dbpass@localhost/database"); //changed actual values...
$q = new Doctrine_RawSql($conn);
$q->select('{c.name}')
->distinct()
->from('contactlist c')
->addComponent('c', 'Contactlist');
//this outputs: SELECT DISTINCT c.name AS c__name FROM contactlist c
echo $q->getSqlQuery() . "<br>\n";
$contacts = $q->execute();
foreach($contacts->toArray() as $contact){
echo $contact['name'] . "<br>\n";
}
?>
Причина доктрины всегда добавляет первичный ключ в список полей, лежит внутри гидратации. Когда доктрина выбирает строки из базы данных, она гидратата (= преобразует) их в иерархию объекта и ссылается на объекты модели с использованием первичного ключа. В вашем случае это поведение не хотелось, так как только имени города представляют интерес.
Я предлагаю два решения, к сожалению, я не могу тестировать их прямо сейчас.
$ q = doctrine_rawsql :: Create ()
-> Выбрать («отлично {REC.city}»)
-> От ('Records Rec')
-> Где ('rec.state =?', $ State)
-> AddComponent («REC», «RECORD»);
$ CULTIONS = $ Q-> EXECUTE ()
$ q = ustrine_query :: create ()
-> Выбрать («отчетливый rec.city»)
-> От ('Records Rec')
-> Где («rec.State =?», $ State);
$ Cities = $ Q-> Execute (Array (), Doctrine_Core :: Hydrate_scalar);
$ Города должны содержать массив массивов с Клавиши, такие как «REC_CITY».
Обратите внимание на использование ?
Placeholder в заявлениях, где приятная практика, чтобы доктрина отказалась от побега и не борьба с этим самостоятельно.
DISTINCT - это функция агрегирования. Таким образом, Doctrine не может преобразовать ваш результат в объекты. Используйте другую стратегию гидратации, как предлагает Бартман.
$q = Doctrine_Query::create()
->select('DISTINCT rec.city')
->from('Records rec')
->execute(array(), Doctrine_Core::HYDRATE_SCALAR);
у меня сработало
Нет необходимости в RawSql
Вместо -> select ('DISTINCT rec.city')
Используйте -> select ('DISTINCT (rec.city ) as city ')
Не могли бы вы использовать GROUP BY?
Doctrine_Query::create()
->select('rec.school')
->from('Records rec')
->where("rec.city='$city' ")
->groupBy('rec.school')
->execute();