Красноречивое обновление модели неоднозначного поведения - PullRequest
0 голосов
/ 07 января 2019

У меня проблема с обновлением моего профиля / пользовательских данных. Я использую смешанный шаблонный метод \ шаблоны проектирования цепочки ответственности, чтобы начать процесс обновления во всей системе, чтобы процесс обновления начинался внутри транзакции, как если бы произошла какая-либо ошибка, и все откатилось. Все работает нормально, и если произошло какое-либо исключение, все откатывается, однако пользовательская модель не обновляется, и когда я регистрирую запрос, выданный 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, который пытается обновить пользователя с нулевым идентификатором

1 Ответ

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

Наконец-то у меня все получилось. Сначала я должен был использовать тот же корпус для первичного ключа, который использовался в базе данных. Вторая проблема - использование модели пользователя по умолчанию, предоставленной Laravel, и свойство fillable, определенное как защищенное в нем по умолчанию. Когда вы используете метод Eloquent fill для объекта модели, а затем сохраняете, метод fill пытается получить доступ к свойству fillable, которое будет невозможно, если оно определено не как public!

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