我在学说中有这种情况:发票与其相关的InvoiceItems。如果相关的发票已关闭,我想拒绝InvoiceItems上的更改,也可能在发票的preSave方法中。我应该怎么做?学说拒绝主记录相关记录的更新
1
A
回答
0
在学说1.x中我已经覆盖了isValid()
方法对混凝土Doctrine_Record
(这里,LineItem
):
public function isValid($deep = false, $hooks = true) {
$q = Doctrine_Query::create()
->select('co.uid')
->from('Company co')
->leftJoin('co.workers w')
->leftJoin('co.customers cust')
->leftJoin('cust.workCases wc')
->where('w.uid = ?', $this->_workerUid) // This LineItem's Worker must _always_ have the same Company as this LineItem (through LineItem -> WorkCase -> Customer -> Company)
->andWhere('wc.state = ?', WorkCase::STATE_OPEN) // This LineItem's WorkCase must be open
->andWhere('wc.uid = ?', $this->_caseUid);
$company = $q->fetchOne();
return $company !== false && parent::isValid($deep, $hooks);
}
有几件事情,这里要注意:
- 我试图根据一些标准获取
Company
(其中,state
必须“打开”)。最终结果取决于我是否找到满足这些标准的公司($company !== false
) isValid()
是覆盖的更深入实施。 总是使最终结果取决于parent::isValid($deep, $hooks)
(我们必须确定原始实现也很开心)。- 你可能会让“取公司记录”更简单一些。
2
有几种可能性,你将如何实现这样的事情,这真的取决于你的情况,应用程序的业务逻辑等。(此外,你应该指定主义分支的1.x或2.x的)
它是完整性约束,在数据库级别执行:假设你的表有一个preUpdate触发器,它会引发异常(只有一些DB可以这样做,认为Postgres,Oracle),或者什么也不做,只是停止更新操作。
由于@jensgram建议,您可以覆盖验证方法,并且要么返回无效状态,或者因为它是完整性和逻辑约束,恕我直言
- 你可能会抛出异常,因为这不是一个验证问题
使用preSave方法,或者跳过保存(但用户不会注意到某个事物)或再次抛出异常。
在您的应用程序中,您不应该允许用户进入这种情况。您的图形用户界面应该是明确的,并清楚地显示该发票已关闭,无法进一步修改。
就个人而言,我会用这样的情景: 首先,解决4号,不允许用户这样做。为了安全起见,请直接在数据库中实施触发器,以防止应用程序中的错误更改已关闭的发票,但默默地执行,不会产生错误,只需跳过保存操作(解决方案1)即可。这种方法还有一个优点。如果您发现自己处于这种情况,那么当您需要从任何其他应用程序连接到数据库时,该完整性约束将被保留。
相关问题
- 1. 学说:不加载相关记录
- 2. 记录更新中丢失的学说关系
- 3. 如何创建相关的记录与学说PHP
- 4. 学说找到没有外键的相关记录
- 5. 相关记录
- 6. 相关记录
- 7. laravel插入或更新相关记录
- 8. 如何仅在相关记录存在时更新相关记录?
- 9. symfony3学说。为相关记录创造条件
- 10. 相关子查询 - 计数记录“小于”主查询记录
- 11. Symfony的学说,唯一的记录
- 12. Linq2SQL相关记录
- 13. PHP的学说产生空记录
- 14. 如何拒绝Go的Aerospike记录?
- 15. 更新记录
- 16. 更新记录
- 17. PHP主义 - 加载相关记录
- 18. 初学者顺利更新记录PDO
- 19. 学说记录听众从未解雇
- 20. PHP:学说:订单加入记录
- 21. 不能拒绝HtmlUnit日志记录
- 22. 更新记录在记录库j2me
- 23. dao记录集更新错误记录
- 24. 更新数据库时,所有记录更新为相同的值记录
- 25. 更新重复记录,保留记录(Min)(日期)相同
- 26. 更新记录的外键字段基于新插入的记录的主键
- 27. 更新查询以更新'其他记录之间的记录?
- 28. Linq更新记录
- 29. Sqlite更新记录
- 30. Haskell记录更新
不错,但现在我有演出的问题。我的InvoiceItems可能有几百个,在保存发票之前我无法进行数百个查询。我是对的还是缺少什么? – giorgio 2011-03-24 10:23:47
@giorgio那么,为了保持一致性,您无法事先获取'Invoice'的状态(至少在*之前不会)。因此,在每次更改“InvoiceItem”之前,都需要某种形式的查询。 – jensgram 2011-03-24 10:27:02