select o.id, o.name, i.id, i.quantity from order as o left join item as i on o.id=i.order_id where o.created>'2012-12-12' and i.status=1;
のように複数のテーブルからデータを取得する方法です。
まずすることは、orderとitemテーブル用にOrderモデルとItemモデルを作成します。
次に、Orderモデルで
public function relations() { return array( 'items' => array(self::HAS_MANY, 'Item', 'order_id'), ); }
のようにrelationsの設定を行います。
この場合、orderとitemは一対多の関係にあるということを示しています。
※relationsの設定については公式ガイドに詳しく載っています。
Orderモデル内で、findAllを使ってデータを取得する場合は、
$criteria = new CDbCriteria; $criteria->select='t.id, t.name, items.id, items.quantity'; $criteria->compare('t.created','>2012-12-12'); $criteria->compare('items.status','1'); $datas=$this->with(array('items'))->findAll($criteria);
のようにすればよいです。
また、CActiveDataProvider経由でデータを取得する場合、
$criteria = new CDbCriteria; $criteria->select='t.id, t.name, items.id, items.quantity'; $criteria->compare('t.created','>2012-12-12'); $criteria->mergeWith(array( 'with' => array( 'items'=>array( 'condition'=>'items.status=:status', 'params'=>array( ':status'=>1 ), ), ), 'together'=>true)); $dataProvider =new CActiveDataProvider(get_class($this), array( 'criteria' => $criteria, ));
のようにする必要があります。
ちなみに、GridViewなどでデータを表示する場合は以下のようにします。
<?php $this->widget('bootstrap.widgets.TbGridView',array( 'id'=>'order-grid', 'dataProvider'=>$dataProvider, 'columns'=>array( 'id', 'name', array( 'name'=>'items.id', 'value'=>'$data->items[0]->quantity' ), array( 'name'=>'items.quantity', 'value'=>'$data->items[0]->quantity' ), ), ));?>
※注意
relationsでHAS_MANYを使っている場合、「$data->items[0]->quantity」のようにitemsのところが配列になります。
HAS_ONEの場合なら「$data->items->quantity」となります。