Удалить () или forceDelete (). Лучший способ определить - PullRequest
0 голосов
/ 10 января 2019

У меня есть база данных с 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();
            }

Я чувствую, что должен быть лучший способ сделать это! Есть ли?

1 Ответ

0 голосов
/ 10 января 2019

Вам необходимо добавить records_count в users таблицу, которая будет увеличиваться каждый раз, когда пользователь добавляет контент в другие таблицы, поэтому после этого изменения решение будет простым, как:

$result = ($this->user->records_count > 0) 
          ? $this->user->delete() 
          : $this->user->forceDelete(); 

Или напишите консольную команду Laravel и запустите ее в фоновом режиме, который будет проходить через базу данных и выполнять операции очистки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...