Иногда в контроллере мы получаем имя модели в виде строки, например ‘Items’. А нам надо получить объект – модель Items, что бы потом, к примеру выполнить запрос:

Я использую для этого вот такую простую функцию в контроллере, наверное ее можно вынести в helper.

Если имя не передано, то получаем модель этого контроллера, т.е. в ItemsController это будет Items
Выполнить вышеприведенный запрос можно так:

Понятно, что если нам заранее известно имя модели, то это совсем не нужно.
Этот код может пригодится для придания коду универсальности. Я написал все функции сохранения и обновления для всех контроллеров одинаковые и вынес их в родительский контроллер, после этого в данном конкретном проекте, мне достаточно было создать контроллер с нужным именем и все.

Применений можно найти много – суть: получение модели из строки с ее именем

 

UPD:

Как правильно заметил в комментариях Илья, гораздо более правильный и простой, на самом деле, способ получения модели по имени в Yii – это использовать предусмотренный в методе model() передачу имени класса.

А именно:

В описании метода model() класса CactiveRecord об этом прямо так и сказано. По умолчанию в метод передается “волшебная” константа (Magic constants)  __CLASS__ (именно так с двумя подчеркивания спереди и сзади), которая в классе возвращает имя класса, именно так как оно задано, с учетом регистра.

Т.е. проще говоря все наши мучения сводятся к одной строке:

 

Yii – получение модели по имени
Метки:                    
  • Илья

    Никогда не используйте $var::model()->…..
    Вместо этого CActiveRecord::model($var)->…