我们知道默认的在后台中一个表对应一个dbschema,一个dbschema对应一个finder列表,但是有时候我们需要在一个finder列出两个或两个以上的表的数据,那么默认的情况下则不满足需求。如果需要在一个finder列表中显示多个表的数据有一下两种方法
1)在finder列表中增加虚拟列 2)通过在model中重构count getList get_schema等方法重组finder列表的数据显示
在什么情况下选择使用增加虚拟列的方式来在finder列表中显示多表数据?
1)在要显示的多个表中有一个是要主要显示的表,其他的表只是需要显示一两列即可 2)在需求中不需要对增加的虚拟列进行列表排序那么怎么样增加虚拟列?
增加自定义列中的services.xml中对应的model应该是finder列主要显示的表的model
当增加虚拟列麻烦或不能虚拟列不能满足需求的时候则需要使用重组finder列表数据返回给finder的方法进行finder列表显示多表数据
首先来看下finder列表是怎么获取数据显示的?
这里只是为了说明finder数据的显示,做了简化。 在默认的finder列表显示数据中, 1)finder显示的数据统计(共N条)是由对应的model中的count方法获取。 2)finder显示的数据是由对应model中的getlist方法获取。 3)finder列表title是根据对应model通过get_schema放来获取对应的dbschema的结构那么如果要使得finder列表能显示多表数据则需要在finder对用的model中重构以上几个方法即可
<?php
...
public function count($filter=null){
//自己写sql,返回满足条件的条数
$sql = 'SELECT count(*) as _count FROM (SELECT I.goods_id FROM '.
kernel::database()->prefix.'b2c_orders as O LEFT JOIN '.
kernel::database()->prefix.'b2c_order_items as I ON O.order_id=I.order_id LEFT JOIN '.
kernel::database()->prefix.'b2c_goods as G ON G.goods_id=I.goods_id WHERE '.
'O.disabled=\'false\' and O.pay_status!=\'0\' and '.$this->_filter($filter).' Group By I.goods_id) as tb';
$row = $this->db->select($sql);
return intval($row[0]['_count']);
}
...
<?php
...
public function getlist($cols='*', $filter=array(), $offset=0, $limit=-1, $orderType=null){
$sql = 'SELECT I.goods_id as rownum,G.name as pname,G.bn as bn,sum(I.nums) as saleTimes,sum(I.amount) as salePrice,I.goods_id FROM '.
kernel::database()->prefix.'b2c_orders as O LEFT JOIN '.
kernel::database()->prefix.'b2c_order_items as I ON O.order_id=I.order_id LEFT JOIN '.
kernel::database()->prefix.'b2c_goods as G ON G.goods_id=I.goods_id WHERE '.
'O.disabled=\'false\' and O.pay_status!=\'0\' and G.goods_id!=\'0\' and '.$this->_filter($filter).' Group By I.goods_id';
if($orderType)$sql.=' ORDER BY '.(is_array($orderType)?implode($orderType,' '):$orderType);
$rows = $this->db->selectLimit($sql,$limit,$offset);
return $rows
}
...
如果getlist方法的条件finder需要过滤,则还需要重构_filter方法
<?php
...
public function get_schema(){
$schema = array (
'columns' => array (
//写法属性和dbschema差不多,对应的字段名是和上面的getlist中获取的字段一致的
'rownum' => array (
'type' => 'number',
'default' => 0,
'label' => app::get('b2c')->_('排名'),
'width' => 110,
'orderby' => false,
'editable' => false,
'hidden' => true,
'in_list' => true,
'default_in_list' => true,
'realtype' => 'mediumint(8) unsigned',
),
'pname' => array (
'type' => 'varchar(200)',
'pkey' => true,
'sdfpath' => 'pam_account/account_id',
'label' => app::get('b2c')->_('商品名称'),
'width' => 210,
'searchtype' => 'has',
'editable' => false,
'in_list' => true,
'default_in_list' => true,
'realtype' => 'mediumint(8) unsigned',
),
...
),
);
return $schema;
...
注:参照案例 class b2c_ctl_admin_analysis extends desktop_controller class b2c_mdl_analysis_productsale extends dbeav_model 另外:在ectools中的报表中也有对应的实例