首先在 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"]', <--问题是,此句应该怎么写才能引用到B.x ?
),
array( 'name'=>'C.x',
'value'=>'$data["x"]', <--同上,此句应该怎么写才能引用到C.x
),
),
));
Page 1 of 1
三表关联如果改用Ar怎面建Relation和引用同名字段?
#2
Posted 21 March 2013 - 11:35 AM
sql 可以起别名的:
然后引用 你最好在查一个主键id出来 ArrayDataProvider 可能要指定一个keyField
你或许应该直接用CSqlDataProvider 不用先findAll 再导到 “数组数据提供者类”里面; findAll 大数据时费内存的 直接用CSqlDataProvider就好因为有分页支持(内部自然是sql语句的limit子句了)所以一次导入内存的数据不会太多并且还有分页支持(小数据量时也可以直接禁用掉分页--这个功能子句查api文档)
good luck!
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文档)
good luck!
#3
Posted 23 March 2013 - 11:05 PM
已经用“自定义主键 + 别名”搞定了,多谢!
不过接着还有新的想法,如果想用Yii 自带 AR实现从“A join B join C ”这种跨表关联Yii能否处理?(个人感觉 AR 中的 BELONGS_TO 等四种关系只是在 A,B 两表之间创建 relation )
接着上面的例子,
如果想用 AR 从 A表关联到 B表再关联到 C表,并同时需要引用到A,B,C表中的同名字段x,relation 应该怎么写呢?同名字段又该如何引用呢?
不过接着还有新的想法,如果想用Yii 自带 AR实现从“A join B join C ”这种跨表关联Yii能否处理?(个人感觉 AR 中的 BELONGS_TO 等四种关系只是在 A,B 两表之间创建 relation )
接着上面的例子,
如果想用 AR 从 A表关联到 B表再关联到 C表,并同时需要引用到A,B,C表中的同名字段x,relation 应该怎么写呢?同名字段又该如何引用呢?
Share this topic:
Page 1 of 1

Help













