【问题标题】:Yii Framework : Join table (or other SQL) in data provider?Yii 框架:在数据提供者中加入表(或其他 SQL)?
【发布时间】:2014-08-07 07:13:06
【问题描述】:

背景

我在“类别”模型中使用了 Gii Crud Generator,我想修改管理表单。

我在“protected/views/Category/admin.php”里面查看,

我发现表格是由一个小部件('zii.widgets.grid.CGridView')呈现的, 并且它使用数据提供者作为它的数据。

我想我可以在 data Provider 中找到一些输入 SQL 查询的地方,但我不明白它是如何工作的。

这些是Model->relations()中的代码,但是我不知道接下来要做什么。

public function relations(){
    return array(
        'cateLang' => array(self::HAS_MANY, 'CategoryLang', 'cate_id')
    );
}

生成数据提供者的位置:

public function search(){

    $criteria=new CDbCriteria;

    $criteria->compare('id',$this->id);
    $criteria->compare('status',$this->status,true);
    $criteria->compare('createDate',$this->createDate,true);
    $criteria->compare('updateDate',$this->updateDate,true);
    $criteria->compare('remark',$this->remark,true);

    return new CActiveDataProvider($this->with('cateLang'), array(
        'criteria'=>$criteria,
    ));
}

目标

我想在“protected/views/Category/admin.php”的表中再添加两列,

这将显示该行的法语标题和英语标题。

要在 SQL 中获取数据,它将是:

SELECT 
    cate.id,
    lang1.name as "FrenchTitle",
    lang2.name as "EnglishTitle",
    cate.updateDate,
    cate.createDate,
    cate.remark 
FROM `category` cate
LEFT JOIN `categorylang` lang1
    ON `lang1`.`cate_id` = `cate`.id 
    AND `lang1`.`lang_id`= 1
LEFT JOIN `categorylang` lang2
    ON `lang2`.`cate_id` = `cate`.id 
    AND `lang2`.`lang_id`= 2
WHERE cate.status = 'live'

如果我可以使用数据提供者,CGridView 参数可能是这样的:

$this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'category-grid',
    'dataProvider'=>$model->search(),
    'filter'=>$model,
    'columns'=>array(
        'id',
        'FrenchTitle',
        'EnglishTitle',
        'createDate',
        'updateDate',
        'remark',
        array(
            'class'=>'CButtonColumn',
        ),
    ),
)); 

【问题讨论】:

  • 向我们展示数据提供者的生成位置(通常这是模型中的 search() 方法)
  • 好的,谢谢。我已经更新了。

标签: php yii


【解决方案1】:

您可以尝试以下方法:

public function search(){

    $criteria=new CDbCriteria;

    $criteria->compare('id',$this->id);
    $criteria->compare('status',$this->status,true);
    $criteria->compare('createDate',$this->createDate,true);
    $criteria->compare('updateDate',$this->updateDate,true);
    $criteria->compare('remark',$this->remark,true);
    $criteria->with = array('cateLang' => array(
        'condition' => 'cateLang.id = 1 OR cateLang.id = 2',
        'order' => 'cateLang.id ASC'
    ));

    return new CActiveDataProvider($this, array(
        'criteria'=>$criteria,
    ));

}

$this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'category-grid',
    'dataProvider'=>$model->search(),
    'filter'=>$model,
    'columns'=>array(
        'id',
        array(
            'name' => 'FrenchTitle'
            'value' => '(isset($data->cateLang[0])) ? $data->cateLang[0]->name : "no Title"',
        ),
        array(
            'name' => 'EnglishTitle'
            'value' => '(isset($data->cateLang[1])) ? $data->cateLang[1]->name : "no Title"',
        ),
        'createDate',
        'updateDate',
        'remark',
        array(
            'class'=>'CButtonColumn',
        ),
    ),
)); 

在搜索中,我指定我只想要 ID 为 1 或 2 的 cateLang 对象,然后在 cgridview 中显示一个关系对象。

【讨论】:

  • 我想知道我能不能把 "$data->cateLang[0]" 改成类似 "$data->findByAttributes(array('lang_id'=>'1'))" 的东西?
  • hum $data 是 Category 类型,所以我认为它不会起作用。可能是:CategoryLang::model()->findByAttributes((array('lang_id'=>'1', 'cate_id' => $data->id))->name。但我不认为这是最佳动作
  • 现在我的工作在这里很好。但是只是为了学习,如果缺少'lang_id=1'的条目会不会出错?是否会在“FrenchTitle”列中显示“EnglishTitle”的数据?
  • 如果你在我的回答中使用解决方案,是的,你会遇到这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多