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!
我在更新 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!