牛骨文教育服务平台(让学习变的简单)
博文笔记

关于tp5的软删除出现的问题

创建时间:2018-01-26 投稿人: 浏览次数:486

测试软删除时出现了一些小问题。

model下user.php文件中

<?php
namespace appindexmodel;
use thinkModel;
use traitsmodelSoftDelete;

class User extends Model
{
	use SoftDelete;
	protected $deleteTime = "delete_time";
}

controller下user.php文件中

<?php
namespace appindexcontroller;
use appindexmodelUser as UserModel;
use thinkController;

class User extends Controller
{
	public function del()
	{
		UserModel::destroy(1);
		// $user = new UserModel();
		// dump($user->select());
		// $user = UserModel::get(2);
		//$user->delete();
		//软删除的原理是找到delete_time 字段 如果这个字段不是null 就会判断这个字段已经被删除 所以::get()的时候就不会返回
	}
}
出现的问题是进行软删除后数据库的delete_time字段没有反应,正常情况下软删除后会更新数据为一个时间戳。经过测试发现,在model中加上use SoftDelete;后直接查询数据库数据查询不到,结果为null,因此等同于软删除操作的对象不存在而导致软删除不成功。

在各种论坛搜索软删除相关的问题没有找到应对此问题的直接方案。

最后发现实际上是数据库的问题,开发文档有明确说明: ThinkPHP5 的软删除功能使用时间戳类型(数据表默
认值为 Null ),用于记录数据的删除时间。

其实软删除的原理是根据标识字段的值来判断数据是否是被删除了,只有NULL是唯一作为数据没有被执行删除操作的标识。我出现问题的原因还是字段默认值的问题,为0,因此也被视作是删除状态,所以查询不到。

我认为测试是否是上述原因导致的数据查询问题的办法之一,可以是通过UserModel::withTrashed()->select();或者UserModel::onlyTrashed()->select();去查询软删除后的数据(前者为包含软删除后的数据,后者为仅查询软删除后的数据),如果此时可以查询到数据,那么虽然delete_time字段值不是时间戳,实际上这个数据已经默认视作被删除,可能就是字段值不为null的原因。



声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。