distinct

Кто знает как в данный запрос можно добавить distinct?




$city = $_GET['q']; 

$limit = min($_GET['limit'], 30);

$criteria = new CDbCriteria;

$criteria->condition = "city LIKE :sterm";

$criteria->params = array(":sterm"=>"$city%");

$criteria->limit = $limit;

$userArray = city::model()->findAll($criteria);

$returnVal = '';



а то документация Yii настолько гениальна что даже не знаю как это сделать. :angry:

пробовал мысля логически добавить:




$criteria->distinct = True;



но не получается. :(

Начиная с 1.0.9 должно работать то, к чему вы пришли логически:




$criteria->distinct = True;



http://www.yiiframework.com/doc/api/1.0.10/CDbCriteria#distinct-detail

Не работает. Все равно из базы приходят все значения.

Думаю хватит с Active Record баловаться перепишу все запросы на DAO :lol:

Списки выдергивать из БД всегда лучше с DAO. С ActiveRedord мы получаем массив достаточно объемных объектов AR из которых нужно взять только атрибуты. В результате неоправданная потяря производительности

Согласен, лично я использую AR на этапе первичной разработки. А потом максимально стараюсь переписать на DAO.

А чего сразу тогда на DAo не писать? Зачем лишний гемор потом себе устраивать?

Это позволяет активно использовать relations и остальные вкусности AR. А потом я делаю перегрузку метода findAll, чтобы он возвращал не объекты, а массивы. Пока в таком подходе не разочаровался и нахожу его очень удобным.




	public function findAll($condition = '', $params = array())

	{

		$criteria = $this->getDbCriteria();

		if ($condition)

			$criteria->mergeWith(array(

				'condition' => $condition,

				'params' => $params));

		$this->_c=null;

		return $this->getCommandBuilder()->createFindCommand($this->getTableSchema(), $criteria)->queryAll();

	}



Я только начал Yii изучать. Так что надо все попробовать. Да и запросов пока не очень много.

to rosko

хороший вариант!

В результате небольшая, но 200% оправданная потеря производительности. Похоже вы не понимаете для чего на самом деле используется ActiveRecord, даже в случае получения данных. Используете DAO - теряете гибкость, масштабируемость и переносимость кода, что вообщем то уже катастрофа. К тому же обычно получаемые списки "пагинируются", таким образом получается очень немного объектов. Далее, используете DAO, забываете автоматически про все вкусности вроде CHtml::active*. ИМХО для себя давно решил DAO - это случай крайнейшей необходимости, который в 99% случаев не требуется. К тому же ковыряние в DAO с целью наращивания функционала стоит намного дороже по $ и по времени, чем upgrade сервера или переход на более мошный тарифный план на вирт. хостинге. Это тоже нужно учитывать.

P.S. Паттерн ActiveRecord - это не UML, используется не для моделирования, а для постоянного промышленного использования.

to Egorka

$criteria->dinstinct=true должно работать. Уточните версию yii, приведите структуру таблицы City, код модели City, разберемся почему не работает…

Разобрался. ::) Когда происходит запрос AR дергает по умолчанию все столбцы базы данных:




SELECT DISTINCT * FROM `geolitecity` WHERE `city` LIKE '$city%' LIMIT 10



получается что строки различны и в результате DISTINCT не работает, я переписал запрос на DAO с выборкой только по нужному мне столбцу




SELECT DISTINCT `city` FROM `geolitecity` WHERE `city` LIKE '$city%' LIMIT 10



и все заработало, отображаются только уникальные значения.

То есть не хватало только одной строчки:




$criteria->select = 'city';



В итоге все работает:




$limit = min($_GET['limit'], 30);

$criteria = new CDbCriteria;

$criteria->condition = "city LIKE :sterm";

$criteria->distinct = True;

$criteria->select = 'city';

$criteria->params = array(":sterm"=>"$city%");

$criteria->limit = $limit;

$userArray = city::model()->findAll($criteria);

$returnVal = '';