我有一个包含95个表的数据库。 users
表存在于系统用户。许多其他表(95个表中的45个表)都有一个“ created_by”,它表示通过users.id
创建/添加了该行的用户。
现在。如果我想删除一个用户,我只是无法去做$user->delete()
,我需要让该用户保持(软删除它),以防该用户在其他表上创建了行。但是,如果该用户没有添加任何内容,那我应该继续$user->forceDelete()
。
我的问题是:是否有一个很好的方法可以做到这一点?当我们拥有大量表时,要检查是否应删除用户或强制删除用户。
我认为我可以循环遍历表并检查是否存在要删除的用户ID,如果找到,则为-> delete(),否则为-> forceDelete()。这是代码:
// Get all tables
$allTables = \DB::connection()->getDoctrineSchemaManager()->listTableNames();
$tablesWithCreatedBy = [];
foreach($allTables as $tableName){
$tableColumns = \DB::getSchemaBuilder()->getColumnListing($tableName);
if(in_array('created_by', $tableColumns)){
$tablesWithCreatedBy[] = $tableName;
}
}
foreach($tablesWithCreatedBy as $tableName){
$result = \DB::select(" SELECT created_by FROM `$tableName`
WHERE `created_by` = {$this->user->id} LIMIT 0, 1 ");
if(isset($result[0])){
$this->user->delete();
break;
}
}
// If wasn't trashed from the code above, then force delete the user!
if(!$this->user->trashed()){
$this->user->forceDelete();
}
我觉得必须有更好的方法!有吗?
答案 0 :(得分:2)
您必须向records_count
表中添加users
,每次用户向其他表中添加内容时,该表都会增加,因此更改解决方案将很简单:
$result = ($this->user->records_count > 0)
? $this->user->delete()
: $this->user->forceDelete();
或者编写Laravel控制台命令并在后台运行它,它将遍历数据库并执行清理操作。