1

我有 2 个模型:taxiDrivers 和 taxOrders。在taxiOrders 中,我有一个字段driver_id,但不仅仅是一个id,我想输出司机的名字(位于taxiDrivers 中)。这两个模型都是通过gii生成的,并且还生成了crud工具。需要修改的页面是taxiOrders/admin(查看:admin.php,模型:TaxiOrders.php,TaxiDrivers.php和各自的控制器)

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,
        ));
    }

所以你能告诉我我可以把你的操作放在哪里吗?

4

3 回答 3

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导致错误。弄清楚如何避免它应该是显而易见的。

于 2013-07-15T05:05:57.673 回答
1

在联合场景中,我总是更喜欢 Query Builder 方法而不是 Active Record 方法。像那样

首先通过查询生成器获取数据

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 方法更容易、更灵活地处理多个连接表。

于 2013-07-15T07:57:32.287 回答
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;
    }

我希望它会帮助你..

于 2013-07-15T04:04:18.360 回答