在bootstrap.widgets.TbGridView中的Yii顺序/搜索相关模型

时间:2013-09-19 23:29:05

标签: php yii

有3张桌子 文章,作者和大学

我正在为桌面文章制作网格。每篇文章都属于一位作者,每位作者都属于一所大学。我需要显示University.name |作者姓名|制品。*

在管理员视图

$gridWidget=$this->widget('bootstrap.widgets.TbGridView',array(
    'id'=>'dados-cd-grid',
    'dataProvider'=>$model->search(),
    'filter'=>$model,
    'columns'=>array(
        'author_name'=>array(
            'name' => 'author_name',
            'value' => '$data->author->name'
        ),
        'university_name'=>array(
            'name' => 'university_name',
            'value' => '$data->university->author->name'
        ),
            ...
array(
            'class'=>'bootstrap.widgets.TbButtonColumn',
        ),
    ),
)); 

在文章模型中我有

public $author_name;
public $university_name;

public function rules()
    {
        ...
        return array(
            array('author.name, university.name, ... ', 'safe', 'on'=>'searc

h'),
         ...
            );
    }
public function search()

{

    $criteria=new CDbCriteria;

    $criteria->with = array( 'author','author.university' );

    $criteria->compare('author.name',$this->author_name,true);
    $criteria->compare('university.name',$this->university_name,true);

    ...

    return new CActiveDataProvider($this, array(
        'criteria'=>$criteria,
        'sort'=>array(
            'attributes'=>array(
                'author_name'=>array(
                    'asc'=>'author.name',
                    'desc'=>'author.name DESC',
                ),
                'university_name'=>array(
                    'asc'=>'university.name',
                    'desc'=>'university.name DESC',
                ),
                '*',
            ),
        ),
    ));
}

网格工作正常。但是当我尝试通过author_name搜索或订购时,我收到了一条错误消息。我将尝试从葡萄牙语翻译错误消息,但我不知道它是否像英语中那样:“未定义的表:7错误:缺少表格作者的条目”

有趣的是,大学搜索和订单工作得很好。我看不出它们之间的差异。

任何人都可以帮助我?

被修改

我已经检查过数据库中的列名是否真的是“名称” 在错误消息中,它显示的部分查询是“(WHERE author.name LIKE ycp0)”。我认为这是我的问题的关键,但我不确切知道如何。

被修改

错误讯息 错误500:

CDbException

CDbCommand falhou ao executar o comando SQL:SQLSTATE [42P01]:未定义的表:7 ERRO:faltando entrada para tabela“autor”nacláusula来自LINE 1:...“autor”。“universidade_id”=“universidade”。 “id”)WHERE(自动...

^。执行的SQL语句是SELECT COUNT(DISTINCT't'。'id')FROM“artigo”'t'LEFT OUTER JOIN'autor''autor'ON('t'。'artigo'。'autor_id '='autor'。'id')LEFT OUTER JOIN'universidade''universidade'ON('autor'。'universidade_id'='universidade'。'id')WHERE(autor.nome LIKE:ycp0)

2 个答案:

答案 0 :(得分:0)

这看起来有点奇怪:

return array( array('author.name, university.name, ... ', 'safe', 'on'=>'search'),

我猜这些属性名称的规则应该在他们自己的类中。我不认为您可以为模型类中的另一个模型定义验证规则。我想这会让Yii认为有一个名为'author.name'的数据库专栏。

此外:

你有这个代码:

'$data->university->author->nome'。不应该是->name吗?

请在您看到的语言中添加您的母语错误。

答案 1 :(得分:0)

找到它!!!

我使用'“table”。“column”'并且有效。我不明白为什么它在没有大学的情况下有效,但作者需要。但是我也把“”放在大学里并且仍在工作,所以我相信使用“”是正确的方法。

感谢所有试图帮助我的人。天堂属于你们。 < 3

//排序

 return new CActiveDataProvider($this, array(
            'criteria'=>$criteria,
            'sort'=>array(
                'attributes'=>array(
                    'author_name'=>array(
                        'asc'=>'"author"."name"',
                        'desc'=>'"author"."name" DESC',
                    ),
                    'university_name'=>array(
                        'asc'=>'university.name',
                        'desc'=>'university.name DESC',
                    ),
                    '*',
                ),
            ),

//搜索

$criteria->compare('"author"."name"',$this->author_name,true);
$criteria->compare('university.name',$this->university_name,true);