У меня есть база данных с 95 таблицами. A users
таблицы существуют для пользователей системы. У многих других таблиц (45 из 95) есть «create_by», который ссылается на пользователя, который создал / добавил строку, через users.id
.
Теперь. Если я хотел удалить пользователя, я просто не могу пойти и сделать $user->delete()
, мне нужно держать пользователя рядом (мягко удалить его), если этот пользователь создал строки в других таблицах. Но что, если этот пользователь не добавил никакого контента, тогда я должен просто пойти дальше и $user->forceDelete()
это.
Мой вопрос: есть ли хороший способ сделать это? Чтобы проверить, нужно ли удалять или принудительно удалять пользователя, когда у нас такое большое количество таблиц.
Я подумал, что мог бы просто зациклить таблицы и проверить, существует ли идентификатор пользователя (подлежащий удалению), если он найден, то это -> 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();
}
Я чувствую, что должен быть лучший способ сделать это! Есть ли?