Zend Framework2 链式多表联合查询—left join

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(没用过),中文资料太少,所有坑都要自己踩,太浪费时间精力和激情了。

原文链接:http://www.ditiner.com/information/newsread/1169476

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值