Главная » Блог » Борьба с defaultScope() в Yii

Борьба с defaultScope() в Yii 

Если Вы хоть раз пользовались возможностью переопределять метод defaultScope() в своих ActiveRecord-моделях, то скорее всего сталкивались с тем, что работает это мягко-говоря криво. Проблема в том, что Yii не подставляет автоматически элиас используемой талблицы к полям в условии (вроде и не должен...) и, если в запросе Ваша таблица используется более одного раза, то Вы получите красивое сообщение о том, что SQL-сервер не может понять к какой именно таблице относится поле в условии. 

Решение "в лоб" - тупо указать "t." перед именами полей в условиях. И это спасает, но только до тех пор, пока Вы не решите включить свою модель в запрос из другой модели (через "with", например). Тогда фреймворк радостно сообщит Вам, что вашего поля в списке полей главной модели не существует....

Короче, ситация такова, что в разных случаях хорошо бы иметь разный элиас. К счастью решение есть и оно не слишком корявое:

public function defaultScope()
{
	// костыль для решения
	$t = $this->getTableAlias(false, false);

	return array(
		'condition' => $t.'.deleted=0 and '.$t.'.finished = 1',
	);
}

Вот так просто мы подсовываем в условия всегда правильный элиас.

ЗЫ
Естественно это же решение применимо и для списка scopes в методах CActiveRecord::scopes().  

Bookmark and Share

Добавьте Ваш комментарий:
Просто совет
Два месяца бесплатного использования VPS-сервера с 20Гб SSD на борту. Интересует?
Тогда жми сюда.
Твиттер-лента
Follow TanitaCMS in Twitter