@Silverviql

Как в Gridview сделать условия чтобы заменить выводимые данные?

Я хочу в таблице Gridview вывести данные по магазинам. Но магазин хранится как цифра а не как строковое значение, я не нашел как можно изменить значение по условию к примеру switch .
[
                'attribute' => 'id_shop',
                'value'=>switch ($model->id_shop) {
                    case 2;
                    $model->id_shop= 'Московский';
                    break;
                    case 6;
                    $model->id_shop= 'Пушкина';
                    break;
                     case 9;
                    $model->id_shop= 'Сибирский';
                    break;
                    case 12;
                    $model->id_shop= 'Четаева';
                    break;
                     case 16;
                    $model->id_shop= 'Маркса';
                    break;
                },
            ],


Такое как я понял не работает.
  • Вопрос задан
  • 126 просмотров
Решения вопроса 2
kimono
@kimono
Web developer
[
  'attribute' => 'id_shop',
  'value'=> function ($model) {
    switch ($model->id_shop) {
      case 2;
      return 'Московский';
      case 6;
      return 'Пушкина';
      case 9;
      return 'Сибирский';
      case 12;
      return 'Четаева';
      case 16;
      return 'Маркса';
    }
    return null;
  }
],


Но лучше вынести расшифровку магазинов куда-нибудь в модель:
[
  'attribute' => 'id_shop',
  'value'=> function (MyModel $model) {    
    return ArrayHelper::getValue(MyModel::getShopList(), $model->shop_id);
  }
],

MyModel extends Model {
  public static function getShopList(){
    return [
      2 => 'Московский',
      6 => 'Пушкина',
      9 => 'Сибирский',
      12 => 'Четаева',
      16 => 'Маркса',
    ];
  }
}
Ответ написан
slo_nik
@slo_nik Куратор тега Yii
Добрый день.
Тут не нужно использовать swith().
Вы бы полностью показали, что именно Вы выводите?
Товар и название магазина, в котором находится товар?
Если да, то Вы вообще не туда смотрите.
Надо использовать связи между таблицами, тогда вывод названия магазина сократится до одной строки.

UPD.
Допустим у Вас есть таблица магазинов и ещё какая-то таблица(допустим называется goods), где хранится только id магазина.
Тогда в моделях делаете связи.
Первая связь в модели магазинов
public function getGoods()
{
    return $this->hasMany(Googs::class, ['id_shop' => 'id']);
}

Вторая связь в модели Goods
public function getShop()
{
    return $this->hasOne(Shop::class, ['id' => 'id_shop']);
}

Тогда в таблице gridView, чтобы вывести название магазина, всё сводится к паре строк
[
  'attribute' => 'id_shop',
  'value'=> 'shop.name'
],

Всё!
И не надо никакого дерьмокода в виде swith()!!!
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы