2

我想从两个表中获取数据。我已经使用下面的代码来做到这一点。我是 Yii 的新手,如果我做错了,请提出正确的方法。

这是控制器的代码:

$dataProvider=new CActiveDataProvider('Users', array(
    'criteria'=>array(
        'with'=>'leave',
        'together'=>true,
        'condition'=>'leave.user_id=:user_id',
        'params'=>array(':user_id'=>$this->loadModel(Yii::app()->user->getId())->user_id),              
    ),
));

$this->render('admin',array(
    'dataProvider'=>$dataProvider,
));

这是视图的代码:

$this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'users-grid',
    'dataProvider'=>$dataProvider,
    'columns'=>array(       
        array(
            'header' => 'Leave Type',
            'name'=>'leave_type',
            'value'=>'$data->leave->leave_type',  
        ),      
        'employee_code',
        'username',
        'password', 
        array(
            'class'=>'CButtonColumn',
        ),
    ),
));

我的问题是:

我正在加入两个表UserLeave。我想从离开表和用户表中获取用户的数据。上面的代码显示了用户表中的数据,当我尝试显示离开表中的数据时,它会抛出以下错误:

试图获取非对象的属性

更新

这是我的用户模型关系:

return array(
    'leaves' => array(self::HAS_MANY, 'Leaves', 'leave_id'),
    'creator' => array(self::BELONGS_TO, 'Users', 'created_by'),
    'updator' => array(self::BELONGS_TO, 'Users', 'modified_by'),   
    'leave' => array(self::HAS_MANY, 'Leaves', 'user_id'),  
);

这是我的休假模型关系:

return array(
    'user' => array(self::BELONGS_TO, 'Users', 'user_id'),
    'creator' => array(self::BELONGS_TO, 'Users', 'created_by'),
    'updator' => array(self::BELONGS_TO, 'Users', 'modified_by'),           
);
4

2 回答 2

0

你不能显示leave关系,因为它是一个 HAS_MANY,我的意思是,在你的 $data->leave 中有一个 Leave 对象数组。

您应该实现 implode 函数,例如:

'value'=> "implode(', ', array_map(function($object) { return $object->leave_type; }, 
           $data->leave))"

顺便说一句,leave我认为关系应该是 HAS_ONE 而不是 HAS_MANY,在这种情况下,您不需要 GridView 中的内爆函数

于 2013-07-31T10:33:21.580 回答
0
'value'=>'$data->leave->leave_type', // WRONG

$data->leave = 对象数组,您无法从中直接访问 leave_type。该数组是从您的以下关系返回的:

'leave' => array(self::HAS_MANY, 'Leaves', 'user_id'), 

我不确定您要访问的休假类型并将其与用户相关联。但是在这种情况下,解决方案是您可以添加更多关系以仅访问用户的首次离开记录

'singleLeave' => array(self::HAS_ONE, 'Leaves', 'user_id'), // add this line on Model User

然后你可以正确访问它'value'=>'$data->singleLeave->leave_type',

实际上,在第一种方法中,$data->leave 应该填充 Leaves 数组,并且从那里,每个 Leave 记录都应该进入子视图,这是您必须详细说明的地方

于 2013-07-31T12:41:13.373 回答