gpt4 book ai didi

php - Doctrine2 不可变实体和仅附加数据结构

转载 作者:行者123 更新时间:2023-11-29 01:37:31 26 4
gpt4 key购买 nike

我喜欢 Marco Pivetta 在 2016 年 PHP 英国 session (https://youtu.be/rzGeNYC3oz0?t=2011) 上描述的技术,他建议支持不可变实体而不是更改数据结构 - 附加它们 .出于许多不同的原因,将更改历史作为奖励是一件好事,因此我想将这种方法应用到我的项目中。让我们看一下以下用例:

class Task {
protected $id;
/**
* Status[]
*/
protected $statusChanges;

public function __construct()
{
$this->id = Uuid::uuid4();
$this->statusChange = new ArrayCollection();
}

public function changeStatus($status, $user){
$this->statusChange->add(new Status($status, $user, $this);
}

public function getStatus()
{
return $this->statusChange->last();
}
}

class Status {
protected $id;
protected $value;
protected $changedBy;
protected $created;

const DONE = 'Done';

public function __construct($value, User $changedBy, Task $task)
{
$this->id = Uuid::uuid4();
$this->value = $value;
$this->changedBy = $changedBy;
$this->task = $task;
$this->created = new \DateTime();
}
}

$user = $this->getUser();
$task = new Task();
$task->changeStatus(Status::DONE, $user);
$taskRepository->add($task, $persistChanges = true);

我计划将所有状态更改保存在 MySQL 数据库中。因此关联将是一个(任务)对多(状态)。

1) 按当前状态获取任务的推荐方法是什么? IE。所有当前打开、完成、待处理的任务。

$taskRepository->getByStatus(Status::DONE);

2) 您对这项技术有何看法,随着项目的发展, future 是否会出现一些缺点?

3) 在哪里保存状态更改更实用(作为任务字段中的序列化数组,还是在单独的表中?

感谢您的意见!

最佳答案

我想这会因为其中一些基于意见而结束,只是想让你知道。

话虽这么说,我一直对这个想法很感兴趣,但我并没有真正深入研究它,但这是我的想法......

<强>1。按状态查找
我认为您需要在连接中执行某种子查询以获取每个任务的最新状态并匹配它。 (我想指出,这只是观察 SO 而不是实际知识的猜测,因此它可能会很好)。

SELECT t, s
FROM t Task
LEFT JOIN t.status s WITH s.id = (
SELECT s2.id
FROM Status s2
WHERE s2.created = (
SELECT MAX(s3.created)
FROM Status s3
WHERE s3.task = t
)
)
WHERE s.value = :status

或者可能只是(假设合并的 id 和创建的字段是唯一的)...

SELECT t, s
FROM t Task
LEFT JOIN t.status s WITH s.created = (
SELECT MAX(s2.created)
FROM Status s2
WHERE s2.task = t
)
WHERE s.value = :status

2个缺点
我认为必须对每个存储库调用使用上述类型的查询将需要更多工作,因此更容易出错。由于您只是向数据库追加,它只会变得更大,因此存储/缓存空间可能是一个问题,具体取决于您拥有的数据量。

3 保存状态的位置
不可变实体的主要好处是它们可以永远缓存,因为它们永远不会改变。如果您在序列化字段中保存任何状态更改,那么实体将需要可变,这会破坏目的。

关于php - Doctrine2 不可变实体和仅附加数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36650727/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com