我想从两个表中获取数据。我使用了下面的代码。我是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',
),
),
));
我的问题是:
我加入了两个表用户和离开。我想从Leave表以及users表中获取用户的数据。上面的代码显示了user表中的数据,当我尝试显示Leave表格中的数据时,它会引发以下错误:
正在尝试获取非对象的属性
更新
以下是我的用户模型关系:
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'),
);
您不能显示leave
关系,因为它是一个HAS_MANY,我的意思是,在$data->leave中,您有一个leave对象数组。
您应该实现内爆功能,例如:
'value'=> "implode(', ', array_map(function($object) { return $object->leave_type; },
$data->leave))"
顺便说一句,我认为leave
关系应该是HAS_ONE而不是HAS_MANY,在这种情况下,您不需要在GridView 中使用内爆函数
'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记录都必须进入子视图,这就是您必须详细了解