1

私は2つのモデルを持っています:taxiDriversとtaxiOrdersです。TaxiOrders には driver_id フィールドがありますが、単なる ID ではなく、ドライバーの名前 (taxiDrivers にあります) を出力したいと考えています。どちらのモデルも gii を介して生成され、crud ツールも生成されます。変更が必要なページは、taxiOrders/admin (ビュー: admin.php、モデル: TaxiOrders.php、TaxiDrivers.php、およびそれぞれのコントローラー) です。

2 DCoder : ありがとうございます!しかし、もう 1 つのクエリがあり、明確にしていただければ幸いです。次のコードを使用して、標準で生成された 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 の方法は、2 つのモデル クラス間の関係を定義することです (そしてそれを外部キーで強制します)。そうすれば、Yii は 2 つのクラスがどのように関連しているかを知り、関連するデータを簡単にロードできるようになります。

モデル クラスでは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')1 つのレコードを検索する必要があるか、多数のレコードを検索する必要があるかに関係なく、返された各注文にドライバー情報が既に読み込まれていることを確認します。その関連データを自分でロードしようとするよりもはるかに効率的です。

ビューでは、次のようにドライバー情報を出力できます。

echo CHtml::encode($order->Driver->Name);

データの整合性を確保するための外部キーを持っていない限り、ドライバーが既存の注文を消去せずに削除された可能性があります... その場合$order->DriverNULL、上記の行でエラーが発生します。それを回避する方法を考え出すことは明らかです。

于 2013-07-15T05:05:57.673 に答える
1

結合されたシナリオでは、アクティブ レコード アプローチではなく、常にクエリ ビルダー アプローチを好みます。そのように

最初にクエリ ビルダーを使用してデータを取得する

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']),
    ),
)); 

このアプローチは、アクティブ レコード アプローチよりも簡単かつ柔軟に複数の結合されたテーブルで機能します。

于 2013-07-15T07:57:32.287 に答える
1

TaxiOrders admin では、これを使用してドライバー名を表示します

   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 に答える