对于这两个方法,官方的解释是:

    默认情况下查询的数据不包含软删除数据,如果需要包含软删除的数据,可以使用下面的方式查询:

    1. User::withTrashed()->find();
    2. User::withTrashed()->select();

    如果仅仅需要查询软删除的数据,可以使用:

    1. User::onlyTrashed()->find();
    2. User::onlyTrashed()->select();

    以上方法新测有效,没有任何问题:

    1. User::withTrashed()->field(['id','name'])->where($where)->select();

    但,需要注意的是顺序问题,withTrashed()onlyTrashed()必须跟到模型来调用才能生效,如下的语句是不起任何作用的:

    1. User::field(['id','name'])->withTrashed()->select();

    虽然语句不会报错,但调试发现,生成的语句中,还是把软删除数据给排除了 delete_time = 0
    究其原因,可以看vendor/topthink/think-orm/src/Model.php中的 db()方法:
    image.png
    其中对软删除字段的处理(delete_time = 0)就是图中红框,withTrashed()所作的工作,其实就是给withTrashed字段赋值true,从而略过软删除字段的条件,达到查询所有记录的情况。
    这儿具体的我还没看,如果把withTrashed()放到后面,应该是模型调用时一开始就会进入到Db方法,此时的withTrashed字段的值还是false,使得软删除条件就已经存在,那么后面就算withTrashed字段赋值为true也不起作用了。
    感觉tp中好多数据库的方法都是和顺序有关,不能随意交换,做项目的时候还是要多注意,避免掉坑里面了。