Красноречивое обновление модели неоднозначного поведения
У меня возникла проблема с обновлением моего профиля/пользовательских данных. Я использую смешанный шаблон method\chain of responsibility design patterns, чтобы быть моими сценариями обновления во всей системе, так что процесс обновления начинается в транзакции, как будто произошла какая-то ошибка, все откатывается назад.
abstract class UpdateProcessor { protected abstract function BeginTransaction(); protected abstract function Execute(); protected abstract function Commit(); protected abstract function Rollback(); public function ProcessUpdate() { try { $this->BeginTransaction(); $this->Execute(); $this->Commit(); } catch (\Exception $e) { $this->Rollback(); } } }
abstract class BaseProcessor extends UpdateProcessor { public function BeginTransaction() { DB::beginTransaction(); } public function Commit() { DB::commit(); } public function Rollback() { DB::rollBack(); } }
class UserUpdateProcessor extends BaseProcessor { private $repository; private $reqs; public function __construct(BaseRepository $repo, $reqsArray) { $this->repository = $repo; $this->reqs = $reqsArray; } public function Execute() { $handler1 = new UpdateProfiler($this->repository); $handler2 = new UpdateAccount($this->repository->helperRepo); $handler1->nextHandler = $handler2; $handler1->process($this->reqs); } }
class UpdateProfiler extends Handler { public $nextHandler; private $repository; private $keys = [ 'id', 'user_login', 'phone_login', 'user_pass', 'user_email', 'notk']; public function __construct(BaseRepository $repo) { $this->repository = $repo; } public function process($reqsArray) { $this->repository->update(array_diff_key($reqsArray, array_flip($this->keys)), $reqsArray[$this->repository->primaryKey]); if (!is_null($this->nextHandler) && $this->nextHandler instanceof Handler) $this->nextHandler->process($reqsArray); } }
class UpdateAccount extends Handler { public $nextHandler; private $repository; private $keys = [ 'id', 'user_login', 'phone_login', 'user_pass', 'user_email', 'notk']; public function __construct(BaseRepository $repo) { $this->repository = $repo; } public function process($reqsArray) { $this->repository->update(array_intersect_key($reqsArray, array_flip($this->keys)), $reqsArray[$this->repository->primaryKey]); if (!is_null($this->nextHandler) && $this->nextHandler instanceof Handler) $this->nextHandler->process($reqsArray); } }
class DatabaseHelper { ... public function UpdateAccount() { $manager = new AccountManager($this->repository, $this->reqs); $manager->UpdateAccount(); } }
public function update(array $attributes, $id) { ... $model = $this->model->findOrFail($id); $model->fill($attributes); $model->save(); }Все работает нормально, и если происходит какое-либо исключение, все откатывается, однако модель пользователя не обновляется, и при регистрации запроса, выданного ORM, я нахожу это
string(122) "update `wp_users` set `user_login` = ?, `user_pass` = ?, `user_email` = ?, `notk` = ?, `updated_at` = ? where `id` is null" array(5) { [0]=> string(8) "wp_admin" [1]=> string(15) "wp_wordpress123" [2]=> string(31) "amr.mohammad.rashad87@yahoo.com" [3]=> string(16) "clut0tLDj4ESXftv" [4]=> string(19) "2019-01-07 00:55:04" }Я не знаю, почему он запрашивает идентификатор без нулевого значения
where `id` is nullоператор обновления профиля работает точно так же, и он просто отлично работает, и в предложении where он запрашивает идентификатор профилировщика. Может ли кто - нибудь помочь мне исправить это двусмысленное поведение!
Что я уже пробовал:
Я пытаюсь найти решение в google в течение нескольких часов...
Richard MacCutchan
Вы написали этот код, так как же вы ожидаете, что кто-то еще узнает, почему этот пункт существует?
Amr Mohammad Rashad
Я понял причину, по которой он не работал должным образом. Однако мне нужно задать вам вопрос, почему почти всегда, когда я задаю вопрос, я получаю ответы, подобные тому, что вы мне дали! если мы не вставляли код, нас обвиняли/спрашивали как Аскеров! если мы не вставляли код, нас обвиняли/просили не вставлять код.
Я надеюсь, вы знаете, что если я знаю ответ, то не буду спрашивать, и при вставке моего кода я сделал это так, если кто-то видит в нем дефект или он может сказать мне проверить что-то, так как вставленный код не имеет дефектов. Кроме того, когда я выясню ответ, я поставлю его так, чтобы те, у кого есть подобная проблема, могли извлечь выгоду из моего решения.