ThinkPHP5使用SQL Server数据库Order排序的坑

释放双眼,带上耳机,听听看~!

之前发过一篇 TP5 连接 SQL Server 的文章
现在又遇到 order 排序的坑.
该说不说 SQL Server 是真的辣鸡.

简单说明一下需求:
现在有 abcbcd 两张数据表
需要联查 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 数据库这么写就会报错
ThinkPHP5使用SQL Server数据库Order排序的坑插图

那怎么办 改一下吧
因为之前单表查询的时候踩过坑:

$data = Db::name('abc')
	->field('pid,time')
	->order('id','DESC')
	->select();

会报如下错误
ThinkPHP5使用SQL Server数据库Order排序的坑插图1
当时的解决办法是在 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();

结果还是报这个错误
ThinkPHP5使用SQL Server数据库Order排序的坑插图

??? 黑人问号.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.

文章来源于互联网:ThinkPHP5使用SQL Server数据库Order排序的坑

人已赞赏
PHP学习笔记杂七杂八

Windows下PHPStudy安装SQL Server扩展, TP5操作SQL Server

2020-11-17 11:09:03

PHP学习笔记杂七杂八

[小记]WordPress代码压缩优化(不压缩代码高亮)

2020-11-17 11:09:05

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索