Поиск по связанной модели

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Аватара пользователя
porcelanosa
Сообщения: 570
Зарегистрирован: 2010.03.16, 04:31
Откуда: Москва

Поиск по связанной модели

Сообщение porcelanosa »

Есть класс, назовем его Items со связью с моделью один ко многим Props
Во вью получаем список

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

$model->props
, где $model - это экземляр класса Items
Но в этом массиве, надо найти только записи, допустим, по определенному атрибуту is_main
Что сразу приходит в голову - это перебор, массива

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

<? foreach ( $model->props as $prop){
         if($prop->is_main == 1)
                  $mainProp = $prop;
}?>
ну или формируем массив, опять же, если is_main, может быть у многих записей.

Вопрос:
Но ведь это очень некрасиво!
Неужели нет встроенных средств для таких действий?
mcintosh-club.ru - первый мой сайт с использование Yii //
Акустика Sonus Faber Hi-End класса//
Необрезная доска и другие пиломатериалы
Аватара пользователя
sluchainiyznak
Сообщения: 617
Зарегистрирован: 2013.05.19, 17:51
Откуда: ХМАО-Югра, г. Сургут
Контактная информация:

Re: Поиск по связанной модели

Сообщение sluchainiyznak »

Путей решения вашей проблемы много:
1. Жестко прописать критерию в дополнительной свзи

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

return array(
    'props'=>array(self::HAS_MANY, "Prop", "item_id"),
    ...
    'mainProps'=>array(self::HAS_MANY, "Prop", "item_id", "condition"=>"is_main = 1"),
    );
    
    $model = Item::model()->findAll();
    $model->mainProps; 
2. Критерия в контроллере/медельке

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

$criteria =  new CDbCriteria();
$criteria->with = array(
    "props"=>array(
        'condition'=>'is_main = 1'
        ),
    );

$model = Item::model()->findAll($criteria);
$model->props;
3. Scope

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

public function scopes(){
    return array(
        "mainProps"=>array(
            "with"=>array(
                "props"=>array(
                    "condition"=>"is_main = 1"
                    )
                )
            )
        );
}


$model = Item::model()->mainProps()->findAll();
$model->props;
Ответить