Проблема с запросом SELECT CASE

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
BikerLex
Сообщения: 97
Зарегистрирован: 2013.03.06, 12:12

Проблема с запросом SELECT CASE

Сообщение BikerLex »

Контрукция:

Код: Выделить всё

Location::find()->selectLocationType()->all()

Код: Выделить всё

public function selectLocationType()
	{
		return $this->select([
			'id',
			'name',
			new Expression(
			"CASE type
			     WHEN 1 THEN 'Страна'
			     WHEN 2 THEN 'ФО'
			     WHEN 3 THEN 'Регион'
			     WHEN 4 THEN 'Район'
			     WHEN 5 THEN 'Город'
	                END AS type"
			),
		]);
	}
Формирует запрос:

Код: Выделить всё

SELECT
  `id`,
  `name`,
  CASE type
     WHEN 1 THEN 'Страна'
     WHEN 2 THEN 'ФО'
     WHEN 3 THEN 'Регион'
     WHEN 4 THEN 'Район'
     WHEN 5 THEN 'Город'
  END AS type
  FROM `teh_location`
Который при проверки в dbFprge выдает то что нужно, 3 колонки с type, где числа заменены на строки.
Но в

Код: Выделить всё

'<pre>'.print_r(Location::find()->selectLocationType()->all(),1).'</pre>'
type везде 0.
Не пойму в чем дело.
Аватара пользователя
SiZE
Сообщения: 2813
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: Проблема с запросом SELECT CASE

Сообщение SiZE »

https://github.com/yiisoft/yii2/blob/ma ... d.php#L407

https://github.com/yiisoft/yii2/blob/ma ... a.php#L134

Менять так значения в запросе не рекомендую, это не прозрачно и в другой раз если понадобится и текст и число, может потребовать значительного рефакторинга и просто запутать. Заведи виртуальный атрибут, например typeName и возвращай значение ему.
Аватара пользователя
BikerLex
Сообщения: 97
Зарегистрирован: 2013.03.06, 12:12

Re: Проблема с запросом SELECT CASE

Сообщение BikerLex »

SiZE писал(а): 2017.05.26, 07:16 https://github.com/yiisoft/yii2/blob/ma ... d.php#L407

https://github.com/yiisoft/yii2/blob/ma ... a.php#L134

Менять так значения в запросе не рекомендую, это не прозрачно и в другой раз если понадобится и текст и число, может потребовать значительного рефакторинга и просто запутать. Заведи виртуальный атрибут, например typeName и возвращай значение ему.
Спасибо, понял, сделал.
Ответить