Yii realtions

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Аватара пользователя
NeverDie
Сообщения: 70
Зарегистрирован: 2012.05.13, 04:05
Откуда: Минск
Контактная информация:

Yii realtions

Сообщение NeverDie »

Здравствуйте, проблема с relations

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

public $s_catalog;
public $s_model;
public $s_year;

public function relations()
    {
        return array(
            'catalog'=>array(self::MANY_MANY, 'Catalog',
                'tbl_prod_cat(product_id, catalog_id)'),
            'r_year'=>array(self::HAS_MANY, 'Year', 'prod_id'),
            'r_models'=>array(self::HAS_MANY, 'ModProd', 'mod_prod_id'),
            'product_c'=>array(self::HAS_MANY, 'Connect', 'product_id'),
        );
    }

public function UserSearch()
    {
        $criteria=new CDbCriteria;
        $criteria->with = array(
            'r_year'=>array(
                'together'=>true,
                'select'=>'year',
            ),
            'r_models'=>array(
                'together'=>true,
                'select'=>'model_id',
            ),
            'product_c'=>array(
                'together'=>true,
                'select'=>'catalog_id',
            ),
        );
        
        $criteria->compare('year',$this->s_year);
        $criteria->compare('model_id', $this->s_model);
        $criteria->compare('catalog_id', $this->s_catalog);
        $criteria->compare('original', $this->original);
        
        return new CActiveDataProvider(get_class($this), array(
            'pagination'=>array(
                'pageSize'=> 10,
            ),
            'criteria'=>$criteria,
        ));
    }

$this->widget('zii.widgets.CListView', array(
    'dataProvider'=>$model->UserSearch(),
    'itemView'=>'_search',
));
 
Сейчас в таблице модели Product 3 записи, но выводит он, когда нет никаких параметров, только одну, не могу понять, почему...
Аватара пользователя
sluchainiyznak
Сообщения: 617
Зарегистрирован: 2013.05.19, 17:51
Откуда: ХМАО-Югра, г. Сургут
Контактная информация:

Re: Yii realtions

Сообщение sluchainiyznak »

Подключи БД - Профайлер в настройках Yii и посмотри какой именно запрос формируется к БД.
http://www.yiiframework.ru/doc/cookbook ... evelopment
Аватара пользователя
NeverDie
Сообщения: 70
Зарегистрирован: 2012.05.13, 04:05
Откуда: Минск
Контактная информация:

Re: Yii realtions

Сообщение NeverDie »

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

SELECT `t`.`id` AS `t0_c0`, `t`.`name` AS `t0_c1`, `t`.`description` AS `t0_c2`, `t`.`content` AS `t0_c3`, `t`.`price` AS `t0_c4`,
 `t`.`share_price` AS `t0_c5`, `t`.`date` AS `t0_c6`, `t`.`position` AS `t0_c7`, `t`.`is_view` AS `t0_c8`, `t`.`popular` AS 
`t0_c9`, `t`.`new` AS `t0_c10`, `t`.`vin_number` AS `t0_c11`, `t`.`original_number` AS `t0_c12`, `t`.`original` AS 
`t0_c13`, `t`.`produce` AS `t0_c14`, `t`.`material` AS `t0_c15`, `t`.`status` AS `t0_c16`, `t`.`front_image` AS `t0_c17`,
 `t`.`recently_viewed` AS `t0_c18`, `t`.`view_stats` AS `t0_c19`, `t`.`url` AS `t0_c20`, `t`.`seo_description` AS `t0_c21`,
 `t`.`seo_keywords` AS `t0_c22`, `r_year`.`year` AS `t1_c1`, `r_year`.`id` AS `t1_c0`, `r_models`.`model_id` AS `t2_c1`, 
`r_models`.`id` AS `t2_c0`, `product_c`.`catalog_id` AS `t3_c1`, `product_c`.`id` AS `t3_c0` FROM `tbl_product` 
`t` LEFT OUTER JOIN `tbl_years` `r_year` ON (`r_year`.`prod_id`=`t`.`id`) LEFT OUTER JOIN `tbl_models_product` 
`r_models` ON (`r_models`.`mod_prod_id`=`t`.`id`) LEFT OUTER JOIN `tbl_prod_cat` `product_c` ON 
(`product_c`.`product_id`=`t`.`id`) LIMIT 10

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

 SELECT COUNT(DISTINCT `t`.`id`) FROM `tbl_product` `t` LEFT OUTER JOIN `tbl_years` `r_year` ON 
(`r_year`.`prod_id`=`t`.`id`) LEFT OUTER JOIN `tbl_models_product` `r_models` ON (`r_models`.`mod_prod_id`=`t`.`id`)
 LEFT OUTER JOIN `tbl_prod_cat` `product_c` ON (`product_c`.`product_id`=`t`.`id`) 
Аватара пользователя
flashimage
Сообщения: 1517
Зарегистрирован: 2011.01.23, 12:43

Re: Yii realtions

Сообщение flashimage »

Проблема явно не в этом запросе - он правильный - все через left outer и без where - по идее он должен выводить первые 10 записей без нареканий. Скажите задаете ли вы прямо в мускуле значения по умолчанию?
и можно глянуть вьюху _search
Бранчи это гомеоморфические эндофункторы, которые мапятся на субманифолды пространства Гилберта.
Аватара пользователя
NeverDie
Сообщения: 70
Зарегистрирован: 2012.05.13, 04:05
Откуда: Минск
Контактная информация:

Re: Yii realtions

Сообщение NeverDie »

В данных таблицах - связках нет значений по умолчанию.
Вот код, отвечающий за вывод:
экшн:

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

public function actionSearch()
    {
        $model = new Product('UserSearch');
        $model->unsetAttributes(); 
        
        if(isset($_GET['Product']))
            $model->attributes=$_GET['Product'];

        $this->render('search',array(
            'model'=>$model,
        ));
    }

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

$this->widget('zii.widgets.CListView', array(
    'dataProvider'=>$model->UserSearch(),
    'itemView'=>'_search',
));
и сам _search

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

<div class = "b-product_search">
    <section class = "b-product_search_img j-product_preview_image">
        <a href = "<?=$url?>"><?=$img;?></a>
    </section>
    <section class = "b-product_search_right">
        <section class = "b-product_search_title j-product_preview_title">
            <a href = "<?=$url?>"><?=$data->name;?></a>
        </section>
        <section class = "b-product_search_field">
            <p><b>Артикул:</b> <?=$data->vin_number;?></p>
        </section>
        <section class = "b-product_search_field">
            <p><b>Производитель:</b> <?=$data->produce;?></p>
        </section>
        <section class = "b-product_search_field">
            <p><b>Ориг. номер:</b> <?=$data->original_number;?></p>
        </section>
        <section class = "b-product_search_field r-product_search_field">
            <p><b>Описание:</b> <?=$data->description;?></p>
        </section>
        <section class = "b-product_search_cost j-product_preview_cost"><?=$cost;?></section>
        <section class = "b-product_search_cart">
            <a class = "a-add_to_cart" href = "<?=Yii::app()->createUrl('shop/cart/addToCart',array('id'=>$data->id));?>">в корзину</a>
        </section>
    </section>
</div>
Как мне кажется, проблема в связях. Что-то некорректно срабатывает. Но не могу понять, что.
Если вставить в базу данных этот запрос, то находит порядка 10 записей благодаря join
Аватара пользователя
flashimage
Сообщения: 1517
Зарегистрирован: 2011.01.23, 12:43

Re: Yii realtions

Сообщение flashimage »

$model = new Product('UserSearch'); - у тебя есть сценарий UserSearch?
Бранчи это гомеоморфические эндофункторы, которые мапятся на субманифолды пространства Гилберта.
Аватара пользователя
NeverDie
Сообщения: 70
Зарегистрирован: 2012.05.13, 04:05
Откуда: Минск
Контактная информация:

Re: Yii realtions

Сообщение NeverDie »

Вот частичный код модели

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

public $s_catalog;
public $s_model;
public $s_year;

public function rules()
    {
        return array(
            ...
            array('s_catalog, s_year, s_model, original', 'safe', 'on'=>'UserSearch'),
        );
    }

public function UserSearch()
    {
        $criteria=new CDbCriteria;
        $criteria->with = array(
            'r_year'=>array(
                'together'=>true,
                'select'=>'year',
            ),
            'r_models'=>array(
                'together'=>true,
                'select'=>'model_id',
            ),
            'product_c'=>array(
                'together'=>true,
                'select'=>'catalog_id',
            ),
        );
        
        $criteria->compare('year',$this->s_year);
        $criteria->compare('model_id', $this->s_model);
        $criteria->compare('catalog_id', $this->s_catalog);
        $criteria->compare('original', $this->original);
        
        return new CActiveDataProvider(get_class($this), array(
            'pagination'=>array(
                'pageSize'=> 10,
            ),
            'criteria'=>$criteria,
        ));
    }
 
Аватара пользователя
flashimage
Сообщения: 1517
Зарегистрирован: 2011.01.23, 12:43

Re: Yii realtions

Сообщение flashimage »

хм так все переменные кинь туда для безопасного присвоения в моддели
Бранчи это гомеоморфические эндофункторы, которые мапятся на субманифолды пространства Гилберта.
Аватара пользователя
NeverDie
Сообщения: 70
Зарегистрирован: 2012.05.13, 04:05
Откуда: Минск
Контактная информация:

Re: Yii realtions

Сообщение NeverDie »

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

array('id, name, vin_number, description, content, original_number, produce, material, original, price, share_price, date, position, is_view, popular, new, front_image, recently_viewed, view_stats, url, seo_description, seo_keywords, s_catalog, s_year, s_model, original', 'safe', 'on'=>'UserSearch'),
 
Не помогло ).
Аватара пользователя
lancecoder
Сообщения: 2532
Зарегистрирован: 2012.06.26, 17:16

Re: Yii realtions

Сообщение lancecoder »

3 параметр compare наверняка
Tsyba.org
Сообщения: 2
Зарегистрирован: 2013.05.24, 09:48
Контактная информация:

Re: Yii realtions

Сообщение Tsyba.org »

Связь таблиц какими кодами определяется? Нигде не могу найти...
Аватара пользователя
NeverDie
Сообщения: 70
Зарегистрирован: 2012.05.13, 04:05
Откуда: Минск
Контактная информация:

Re: Yii realtions

Сообщение NeverDie »

3 параметр compare наверняка
Не совсем понял про параметр
Связь таблиц какими кодами определяется? Нигде не могу найти...
Через релайшнс

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

public function relations()
    {
        return array(
            'catalog'=>array(self::MANY_MANY, 'Catalog',
                'tbl_prod_cat(product_id, catalog_id)'),
            'r_year'=>array(self::HAS_MANY, 'Year', 'prod_id'),
            'r_models'=>array(self::HAS_MANY, 'ModProd', 'mod_prod_id'),
            'product_c'=>array(self::HAS_MANY, 'Connect', 'product_id'),
        );
    }
 
И в самом поиске с помощью with и together true

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

$criteria=new CDbCriteria;
        $criteria->with = array(
            'r_year'=>array(
                'together'=>true,
                'select'=>'year',
            ),
            'r_models'=>array(
                'together'=>true,
                'select'=>'model_id',
            ),
            'product_c'=>array(
                'together'=>true,
                'select'=>'catalog_id',
            ),
        );
 
Аватара пользователя
flashimage
Сообщения: 1517
Зарегистрирован: 2011.01.23, 12:43

Re: Yii realtions

Сообщение flashimage »

Ну для очистки совести, можно закоментить все компейры, изменить сценарий (все меленькими написать), проверить все перехваты событий (afterFind, beforeFind и тд.), в релейшенах добавить on
Бранчи это гомеоморфические эндофункторы, которые мапятся на субманифолды пространства Гилберта.
Аватара пользователя
NeverDie
Сообщения: 70
Зарегистрирован: 2012.05.13, 04:05
Откуда: Минск
Контактная информация:

Re: Yii realtions

Сообщение NeverDie »

Итак, нашел откуда идет проблема, но не знаю пока, как решить.
Запрос

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

public function UserSearch()
    {
        $criteria=new CDbCriteria;
        $criteria->with = array(
            'r_year'=>array(
                'together'=>true,
                'select'=>'year',
            ),
            'r_models'=>array(
                'together'=>true,
                'select'=>'model_id',
            ),
            'product_c'=>array(
                'together'=>true,
                'select'=>'catalog_id',
            ),
        );
        
        $criteria->compare('year',$this->s_year);
        $criteria->compare('model_id', $this->s_model);
        $criteria->compare('catalog_id', $this->s_catalog);
        $criteria->compare('original', $this->original);
        
        $c['data'] = self::model()->findAll($criteria);
        
        return $c;

    }
 
во views

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

$products = $model->UserSearch();
foreach($products ['data'] as $data) {
    $this->renderPartial('_search', array('data'=>$data));
}
 
срабатывает хорошо, выводит все необходимые параметры, применяет фильтры. Но как только каким-либо образом добавляется пагинация, начинается та же песня с выводом одного товара.

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

public function UserSearch()
    {
        $criteria=new CDbCriteria;
        $criteria->with = array(
            'r_year'=>array(
                'together'=>true,
                'select'=>'year',
            ),
            'r_models'=>array(
                'together'=>true,
                'select'=>'model_id',
            ),
            'product_c'=>array(
                'together'=>true,
                'select'=>'catalog_id',
            ),
        );
        
        $criteria->compare('year',$this->s_year);
        $criteria->compare('model_id', $this->s_model);
        $criteria->compare('catalog_id', $this->s_catalog);
        $criteria->compare('original', $this->original);
        
        $c['pages'] = new CPagination(self::model()->count());
        $c['pages'] -> pageSize=2;
        $c['pages'] -> applyLimit($criteria);
        
        $c['data'] = self::model()->findAll($criteria);
        
        return $c;
    }

<?php 
$products = $model->UserSearch();
foreach($products ['data'] as $data) {
    $this->renderPartial('_search', array('data'=>$data));
}
?>
<?php $this->widget('CLinkPager',array('pages'=>$products['pages'])); ?>
Самое забавное, что количество страниц он определяет как надо, но количество товара упорно отказывается выводить правильно.
Ответить