zf2–zendframework2 相比于tp3,laraval 来讲,并不是很好用,尤其是表的初始化比较麻烦,另外就是复杂查询了。
虽然文档里提供了很多诸如columns,where,order,limit等链式查询的样例,但是有些情况真是始料不及。
我现在有四张表:fruite,fruitename,fruitekind,village,分别代表了水果种植情况,水果名字,水果品种,村名。
fruite表:
fruitename表:
fruitekind表:
village表:
现在我要查询的结果集是:fruite表中的frid,uid,season,status字段,fruitename表中的name字段,fruitekind中的name字段,village表中的name字段。
其中
fruite.name=fruitename.fnid,
fruite.kind=fruitekind.fkid
,fruite.viid=village.viid
原先的查询语句是:
$sqlselect->columns(array(‘producer’, ‘status’,‘season’,‘uid’,‘frid’));
$sqlselect->join(‘fruitename’, ‘fruitename.fnid =fruite.name’,array(’'name '), ‘left’);
现在问题是,fruitename中有name 字段,fruitekind中有name字段,village中有name字段,那么怎么区分这三个name呢。如果是mysql语句,那就简单了,直接fruitename.name as fruitename,fruitekind.name as kind,village.name as village就可以区分。
但是在zendframework2怎么办呢?遍查资料,都没有找到直接的方法。其实有个笨方法,就是修改其他表的字段名。但是这个看似简单,但是工程量巨大,而且不知在什么地方就埋下了地雷。
还有一种就是用mysql语句查询,不适用框架自带的链式语句。
我想,zend这么多工程师,不会没有这个问题的方案,经过测试,终于找到了。
$sqlselect->join('fruitename', 'fruitename.fnid =fruite.name', array('name'=>'name '), 'left');
$sqlselect ->join('fruitekind', 'fruitekind.fkid = fruite.kind', array('kind'=>'name '), 'left');
$sqlselect ->join('village', 'village.viid = fruite.viid', array('village'=>'name '), 'left');
重点是:‘新的字段名’=>‘原表的字段名’,方向不要搞反。
最后还有一个坑,这个是之前踩过的,我们知道fruite表要生效的话,需要在model里建两个类文件,其中一个命名为fruite.php,一个命名为fruitetable.php。
现在要让我们的联合查询生效,还需要在fruite里增加我们刚才联合查询新增的village字段。
public $village;
t h i s − > v i l l a g e = ( ! e m p t y ( this->village = (!empty( this−>village=(!empty(data[‘village’])) ? $data[‘village’] : null;
而kind和name 不用新增的原因仅仅是原表已经含有这两个字段,虽然此时这两个字段已经被我们改变了含义和属性。
心累!
最后,如果大家一定要用php开发,还是选择thinkphp或者laraval吧,zf2或者zf3(没用过),中文资料太少,所有坑都要自己踩,太浪费时间精力和激情了。