Yii Framework 1.1 CdbCriteria с несколькими JOIN в GridView - PullRequest
0 голосов
/ 06 июня 2019

Я начинаю в мире фреймворка Yii в версии 1.1, и я не могу визуализировать записи, извлеченные из чистого запроса.Прошло много дней с тех пор, как я не могу решить это, возможно, это что-то простое, но из-за моих плохих знаний я еще не смог решить это.Я показываю вам свой код, чтобы увидеть, можете ли вы мне помочь.

Отношения модели TblRecibo, в которую я хочу сделать запрос:

public function relations()
{
    // NOTE: you may need to adjust the relation name and the related
    // class name for the relations automatically generated below.
    return array(
        'tblEstadoreciboHasTblRecibos' => array(self::HAS_MANY, 'TblEstadoreciboHasTblRecibo', 'idRecibo'),
        'tblItemrecibowebs' => array(self::HAS_MANY, 'TblItemreciboweb', 'idRecibo'),
        'idCalendario0' => array(self::BELONGS_TO, 'TblCalendario', 'idCalendario'),
        'idDomicilioApertura0' => array(self::BELONGS_TO, 'TblDomicilio', 'idDomicilioApertura'),
        'idDomicilio0' => array(self::BELONGS_TO, 'TblDomicilio', 'idDomicilio'),
        'idPaquete0' => array(self::BELONGS_TO, 'TblPaquete', 'idPaquete'),
    );
}

Моя модель:

public function search()
{      
    $criteria = new CDbCriteria;
    $criteria->alias = 'r';
    $criteria->select = 'r.idRecibo,d.matricula,d.federado,e.nombre,d.calle,r.cantidad,cal.periodo,est.ult_modif,os.nombre ';
    $criteria->join ='LEFT JOIN tbl_calendario as cal on r.idcalendario=cal.idcalendario '
            .'LEFT JOIN tbl_estadorecibo_has_tbl_recibo as est on r.idrecibo=est.idrecibo '
            .'LEFT JOIN tbl_domicilio as d ON r.iddomicilioapertura=d.idDomicilio '
            .'LEFT JOIN tbl_entidad as e ON d.idEntidad=e.idEntidad '
            .'LEFT JOIN tbl_itemreciboweb as rweb on r.idrecibo=rweb.idrecibo '
            .'LEFT JOIN tbl_ooss as os on rweb.idooss=os.idooss';
    return new CActiveDataProvider($this, array(
        'criteria' => $criteria,
        'pagination' => array('pageSize' => Yii::app()->user->getState('pageSize', Yii::app()->params['defaultPageSize']),
        ),
    ));
}

Мой контроллер:

public function actionIndex()
{
    $model = new TblRecibo('search');
    $model->unsetAttributes();  // clear any default values
    if (isset($_GET['TblRecibo']))
        $model->attributes = $_GET['TblRecibo'];
    $this->render('admin', array(
        'model' => $model,
    ));
}

Мой взгляд:

<?php
 $this->widget('bootstrap.widgets.TbGridView', array(
   'type'=>'bordered striped',
    'id' => 'tbl-recibo-grid',
    'dataProvider' => $model->search(),
    'htmlOptions'   =>array('style' => 'font-size: 16px;font-weight: normal'),
    'columns' => array(
        'idrecibo',
        'dom.matricula',
        'dom.federado',
        'ent.nombre',
        'dom.calle',
        'rec.cantidad',
        'cal.periodo',
        'est.ult_modif',
        'os.nombre',
    ),
));
?>

При выполнении у меня нет ошибки, только то, что GridView не показываетрезультаты запросов.Я знаю, что не должно быть ничего сложного, потому что отладка значений заключается в том, что я не понимаю, как передать их в Vista.

1 Ответ

0 голосов
/ 06 июня 2019

При выборе типа r.idRecibo,d.matricula,d.federado, ... результат будет возвращен с ключами типа idRecibo, matricula, federado и т. Д. Чтобы обработать такой запрос, вам необходимо добавить все поля из объединенных таблиц в вашу модель:

TblRecibo extends CActiveRecord {

    public $matricula;
    public $federado;
    // ...
}

А затем в виде сетки получить к ним доступ:

'columns' => array(
    'idRecibo',
    'matricula',
    'federado',
    // ...
),

Но для таких пользовательских запросов может быть проще использовать CSqlDataProvider вместо CActiveDataProvider - вам не нужно добавлять свойства в модель только для этого поиска - результат будет возвращен в виде массива:

public function search() {      
    $from = 'FROM tbl_recibo as r '
            . 'LEFT JOIN tbl_calendario as cal on r.idcalendario=cal.idcalendario '
            . 'LEFT JOIN tbl_estadorecibo_has_tbl_recibo as est on r.idrecibo=est.idrecibo '
            . 'LEFT JOIN tbl_domicilio as d ON r.iddomicilioapertura=d.idDomicilio '
            . 'LEFT JOIN tbl_entidad as e ON d.idEntidad=e.idEntidad '
            . 'LEFT JOIN tbl_itemreciboweb as rweb on r.idrecibo=rweb.idrecibo '
            . 'LEFT JOIN tbl_ooss as os on rweb.idooss=os.idooss';
    $count = Yii::app()->db->createCommand('SELECT COUNT(*) ' . $from)->queryScalar();
    $sql = 'SELECT r.idRecibo,d.matricula,d.federado,e.nombre,d.calle,r.cantidad,cal.periodo,est.ult_modif,os.nombre ' . $from; 

    return new CSqlDataProvider($sql, array(
        'totalItemCount' => $count,
        'pagination' => array(
             'pageSize' => Yii::app()->user->getState('pageSize', Yii::app()->params['defaultPageSize']),
        ),
    ));
}
...