三表关联如果改用Ar怎面建Relation和引用同名字段?

首先在 control里用sql查询结果生成ArrayProvider :

//sql语句中使用 A.x, B.x, C.x 分别引用 A、B、C 三表中的同名字段x

$sql ='SELECT A.x, B.x, C.x

   FROM A a


   LEFT JOIN B b ON a.id = b.id


   LEFT JOIN C c ON a.id = c.id'

$array_data = Yii::app()->db->createCommand($sql)->queryall();

$ArrayProvider = new CArrayDataProvider($array_data, array(‘keyField’=>‘x’,) //指定字段x作为主键

然后在 view 里使用CGridView 展示:

$this->widget(‘zii.widgets.grid.CGridView’,array(

'dataProvider'=>$ArrayProvider,


'columns'=>array(


	array( 'name'=>'A.x',  


		'value'=>'$data["x"]',


	), 


	array( 'name'=>'B.x',  


		'value'=>'$data["x"]', [color="#FF0000"]<--问题是,此句应该怎么写才能引用到B.x ?[/color]


	), 


	array( 'name'=>'C.x',  


		'value'=>'$data["x"]', [color="#FF0000"]<--同上,此句应该怎么写才能引用到C.x[/color]


	), 





     ), 

));

sql 可以起别名的:





SELECT A.x AS a_x , B.x as b_x , C.x as c_x

FROM A a

LEFT JOIN B b ON a.id = b.id

LEFT JOIN C c ON a.id = c.id




然后引用 你最好在查一个主键id出来 ArrayDataProvider 可能要指定一个keyField

你或许应该直接用CSqlDataProvider 不用先findAll 再导到 “数组数据提供者类”里面; findAll 大数据时费内存的 直接用CSqlDataProvider就好因为有分页支持(内部自然是sql语句的limit子句了)所以一次导入内存的数据不会太多并且还有分页支持(小数据量时也可以直接禁用掉分页–这个功能子句查api文档) :D

good luck!

已经用“自定义主键 + 别名”搞定了,多谢!

不过接着还有新的想法,如果想用Yii 自带 AR实现从“A join B join C ”这种跨表关联Yii能否处理?(个人感觉 AR 中的 BELONGS_TO 等四种关系只是在 A,B 两表之间创建 relation )

接着上面的例子,

如果想用 AR 从 A表关联到 B表再关联到 C表,并同时需要引用到A,B,C表中的同名字段x,relation 应该怎么写呢?同名字段又该如何引用呢?

后面的问题没人能帮忙解答一下么?