在持久化表单之前,检查记录是否存在的最佳方法是什么?
- 使用Pre-Perist?但是我可以使用查询吗
- 在控制器中使用查询,如果存在则引发异常
- 使用我的类的存储库
我红了这个https://stackoverflow.com/a/10688065/3942705用于在php/mysql中查询,但我想用symfony来完成。
我将发布一个解决方案,这可能不是最好的性能场景,但它有效,您可以进一步优化它。
假设:AcmeBundle
是您的bundle命名空间,Product
和Media
是您的实体。你需要为你的产品添加一个验证,我已经使用了YML,你可以更改它。
地址:AcmeBundleResourcesconfigvalidation.yml
AcmeBundleEntityProduct:
constraints:
- Callback: { methods: [validate] }
地址:AcmeBundleEntityProduct
class Product
{
/**
* @var DoctrineCommonCollectionsCollection
*/
private $media;
[...]
/**
* @param ExecutionContextInterface $context
*/
public function validate(ExecutionContextInterface $context)
{
$allowedPositions = array(1, 2, 3, 4);
foreach ($allowedPositions as $position) {
$atThisPosition = $this->media->filter(function(Media $media) {
return $media->getPosition() === $position;
});
$count = $atThisPosition->count();
if ($count > 1) {
$context->addViolationAt('media', sprintf("Trying to set %d media at position %d", $count, $position));
}
}
}
}
好的,如果您希望您的记录是唯一的,那么您可以使用实体验证来检查记录是否是唯一的。假设您有一个User实体。您希望,如果用户的电子邮件或用户名已经存在,那么用户将无法在数据库上持久存在,可以通过检查电子邮件和用户名属性来完成,无论这些属性是否已经存在,这意味着它们是否唯一。有关实体验证的详细信息,您可以看到以下链接:http://symfony.com/doc/current/book/validation.html
更具体地说,如果你想了解UniqueEntity的有效性,你可以看到这个链接:http://symfony.com/doc/current/reference/constraints/UniqueEntity.html#basic-使用
祝好运