之前发过一篇 TP5 连接 SQL Server 的文章
现在又遇到 order 排序的坑.
该说不说 SQL Server 是真的辣鸡.
简单说明一下需求:
现在有 abc
和 bcd
两张数据表
需要联查 abc
表中的 pid
等于 bcd
表中的 id
并且按照 abc
表中的 id
字段倒序排序
– 需求End –
正常 TP5 查询 MySQL 数据库 代码如下
$data = Db::name('abc') ->alias('a') ->join('bcd b','a.pid = b.id') ->field('a.*,b.id as bid') ->order('a.id','DESC') ->select();
是可以正常查询出数据的.
然后 TP5 查询 SQL Server 数据库这么写就会报错
那怎么办 改一下吧
因为之前单表查询的时候踩过坑:
$data = Db::name('abc') ->field('pid,time') ->order('id','DESC') ->select();
会报如下错误
当时的解决办法是在 field()
内加上 order()
排序需要的字段名
$data = Db::name('abc') ->field('id,pid,time') ->order('id','DESC') ->select();
就解决了.
然而这次, 我寻思着我已经 a.*
了不就是把 abc
表里的所有字段都查出来了吗?为什么还不让用?
既然还是报错, 那我就借鉴之前的填坑办法 在 field()
加上 order()
需要用到的字段名吧.
加上之后代码如下
$data = Db::name('abc') ->alias('a') ->join('bcd b','a.pid = b.id') ->field('a.*,a.id,b.id as bid') ->order('a.id','DESC') ->select();
??? 黑人问号.jpg
一顿操作后得到如下两种解决方法:
方法一:
给需要排序的字段在 field()
内起别名.
$data = Db::name('abc') ->alias('a') ->join('bcd b','a.pid = b.id') ->field('a.*,a.id as aid,b.id as bid') ->order('aid','DESC') ->select();
方法二:
直接调用 abc
表内的字段原名 不需要用 表别名.字段名
的格式
如需求中的需要按照 abc
表的 id
字段排序
不需要写成 order('a.id','DESC')
, field()
中也不用给排序字段起别名了, 只需要如下这样写就好了.
$data = Db::name('abc') ->alias('a') ->join('bcd b','a.pid = b.id') ->field('a.*,b.id as bid') ->order('id','DESC') ->select();
最后, 必须再吐槽一句! SQL Server 是真的辣鸡!
— End.
2 Comments
这是tp拼接sql存在问题的原因,怎么能说mssql辣鸡呢。。
@Dai emmm 我是小白 如果言语上让大佬感到不适请谅解