对于这两个方法,官方的解释是:
默认情况下查询的数据不包含软删除数据,如果需要包含软删除的数据,可以使用下面的方式查询:
User::withTrashed()->find();
User::withTrashed()->select();
如果仅仅需要查询软删除的数据,可以使用:
User::onlyTrashed()->find();
User::onlyTrashed()->select();
以上方法新测有效,没有任何问题:
User::withTrashed()->field(['id','name'])->where($where)->select();
但,需要注意的是顺序问题,withTrashed()
和onlyTrashed()
必须跟到模型来调用才能生效,如下的语句是不起任何作用的:
User::field(['id','name'])->withTrashed()->select();
虽然语句不会报错,但调试发现,生成的语句中,还是把软删除数据给排除了 delete_time = 0
究其原因,可以看vendor/topthink/think-orm/src/Model.php
中的 db()
方法:
其中对软删除字段的处理(delete_time = 0
)就是图中红框,withTrashed()
所作的工作,其实就是给withTrashed
字段赋值true
,从而略过软删除字段的条件,达到查询所有记录的情况。
这儿具体的我还没看,如果把withTrashed()
放到后面,应该是模型调用时一开始就会进入到Db方法,此时的withTrashed
字段的值还是false
,使得软删除条件就已经存在,那么后面就算withTrashed
字段赋值为true
也不起作用了。
感觉tp
中好多数据库的方法都是和顺序有关,不能随意交换,做项目的时候还是要多注意,避免掉坑里面了。