У меня проблема с обновлением моего профиля / пользовательских данных. Я использую смешанный шаблонный метод \ шаблоны проектирования цепочки ответственности, чтобы начать процесс обновления во всей системе, чтобы процесс обновления начинался внутри транзакции, как если бы произошла какая-либо ошибка, и все откатилось. Все работает нормально, и если произошло какое-либо исключение, все откатывается, однако пользовательская модель не обновляется, и когда я регистрирую запрос, выданный ORM, я обнаружил, что он не включал столбец / значение id в предложении where в выражении update в то время как это было сделано для модели профиля! Две модели одинаковы. Я использую модель User, предоставленную Laravel, которая также косвенно распространяется на класс Model. Я установил свойство primaryKey в каждой модели на имя столбца идентификатора, а также разрешил значение по умолчанию для увеличивающегося свойства как true.
Я попытался установить инкремент на false и передать значение id с атрибутами обновления, однако это тоже не сработало. Я пытаюсь Google, но не могу найти ответ ...
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);
}
}
public function update(array $attributes, $id)
{
...
$model = $this->model->findOrFail($id);
$model->fill($attributes);
$model->save();
}
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) "xyz@example.com"
[3]=>
string(16) "clut0tLDj4ESXftv"
[4]=>
string(19) "2019-01-07 00:55:04"
}
Ожидается, что при отправке профиля / данные пользователя будут обновляться как единое целое. Я имею в виду, что при обновлении данных профиля только когда я зарегистрировал запрос, сгенерированный ORM, я получил вышеупомянутый проводной sql, который пытается обновить пользователя с нулевым идентификатором