Eloquent 更新模型不明确的行为

Eloquent update model ambiguous behavior

我在更新 profile/user 数据时遇到问题。我正在使用责任设计模式的混合模板 method\chain 在整个系统中开始更新过程,以便更新过程在事务中开始,就好像发生任何错误都回滚一样。一切正常,如果发生任何异常,一切都会回滚,但是,用户模型不会更新,当记录 ORM 发出的查询时,我发现它没有在 where 子句中包含 id column/value在更新配置文件模型时更新语句!两个模型是一样的。我正在使用 Laravel 提供的用户模型,它也间接地从模型 class 扩展而来。我在每个模型中将 primaryKey 属性 设置为 id 列名称,并且我将递增 属性 的默认值设置为 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"
}

预期是在发送要更新的profile/user数据时将它们作为一个单元进行更新。我所拥有的是,仅当我记录了 ORM 生成的查询时才更新配置文件数据,我得到了上面的有线 sql,它试图用 null id

更新用户

终于,我成功了。首先,我必须对数据库中使用的主键使用相同的大小写。我使用默认 Laravel 提供的用户模型和默认定义为受保护的可填充 属性 的第二个问题。当您在模型对象上使用 Eloquent 填充方法然后保存时,填充方法会尝试访问可填充的 属性,如果它的定义不是 public!