2 DCoder :谢谢老兄!但我还有一个问题,希望你能澄清一下:我有一个标准生成的admin.php视图页面,其中包含以下代码:
<?php $this->widget('zii.widgets.grid.CGridView', array(
'id'=>'taxi-orders-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
'columns'=>array(
'id',
'uid',
'did',
'type',
'notes',
//'or_lat',
//'or_lng',
//'des_lat',
//'des_lng',
'cost',
'rating',
'date',
'time',
'status',
array(
'class'=>'CButtonColumn',
),
),
)); ?>
and below code is for controller:public function actionAdmin()
{
$model=new TaxiOrders('search');
$model->unsetAttributes(); // clear any default values
if(isset($_GET['TaxiOrders']))
$model->attributes=$_GET['TaxiOrders'];
$this->render('admin',array(
'model'=>$model,
));
}
那么请你告诉我我可以把你的操作放在哪里。
答案 0 :(得分:4)
Yii方式是定义两个模型类之间的关系(并使用外键强制执行)。然后Yii会知道这两个类是如何相关的,你可以更轻松地加载相关数据。
在TaxiOrders
模型类中,关系看起来像这样:
/**
* @property TaxiDrivers $Driver
*/
class TaxiOrders extends CActiveRecord {
// ...
public function relations() {
return array(
'Driver' => array(self::BELONGS_TO, 'TaxiDrivers', 'driver_id'),
);
}
// ...
}
在控制器中,当您加载订单数据时,您可以预取相关的驱动程序数据,如下所示:
public function actionOrderInfo($orderID) {
$order = TaxiOrders::model()->with('Driver')->findByPk($orderID);
// render it
}
with('Driver')
将确保每个返回的订单都已加载其驱动程序信息,无论您是否需要查找一条记录或大量记录。它比尝试自己加载相关数据要高效得多。
在视图中,您可以输出以下驱动程序信息:
echo CHtml::encode($order->Driver->Name);
除非您有外键来确保数据完整性,否则可能已删除驱动程序而未清除其现有订单......在这种情况下,$order->Driver
将为NULL
并且上面一行会导致错误。弄清楚如何避免它应该是显而易见的。
答案 1 :(得分:1)
在TaxiOrders管理员中使用此功能显示驱动程序名称
TaxiDrivers::getName($data->driver_id);
现在在TaxiDrivers模型中编写一个带有sql查询的函数来获取这样的驱动程序名称......
public function getName($getid) {
$sql = "SELECT name from `taxi_drivers` where `driver_id`='$getid'";
$command=yii::app()->db->createCommand($sql);
$rs = $command->queryScalar();
return $rs;
}
我希望它会对你有帮助..
答案 2 :(得分:1)
在连接方案中,我总是更喜欢使用Query Builder方法而不是Active记录方法。像那样
首先通过查询生成器获取数据
public function getTaxtOrder($id) {
$select = Yii::app()->db->createCommand()
->select('to.*, td.name as driver_name')
->from('TaxiOrders to')
->join('TaxiDriver td', 'td.id = to.driver_id')
->where('to.id = :id', array(':id' => $id));
return $select->queryRow();
}
然后通过控制器
$data = TaxiOrders::model()->getTaxtOrder($id);
$this->render('view',array(
'data' => $data
));
最后将此用于视图
$this->widget('zii.widgets.CDetailView', array(
'data'=>$data,
'attributes'=>array(
array('label' => 'Order No', 'value' =>$model['order_no']),
array('label' => 'Driver Name', 'value' =>$model['driver_name']),
array('label' => 'Date', 'value' =>$model['order_date']),
),
));
与Active Record Approach相比,这种方法可以轻松灵活地使用多个连接表。