Php 保存之前的原则Symfony检查记录
在保存表单之前,检查记录是否存在的最佳方法是什么Php 保存之前的原则Symfony检查记录,php,validation,doctrine-orm,dql,symfony-2.6,Php,Validation,Doctrine Orm,Dql,Symfony 2.6,在保存表单之前,检查记录是否存在的最佳方法是什么 使用Pre Perist?但是我可以使用查询吗 在控制器中使用查询,如果存在,则抛出异常 使用我的类的存储库 我在php/mysql中查询时使用了此选项,但我希望使用symfony来实现此功能。我将发布一个解决方案,这可能不是最佳性能方案,但它可以工作,您可以进一步优化它 假设:AcmeBundle是您的包名称空间,Product和Media是您的实体。你需要为你的产品添加一个验证,我已经用过了,你可以更改这个 位于:AcmeBundle\R
- 使用Pre Perist?但是我可以使用查询吗
- 在控制器中使用查询,如果存在,则抛出异常
- 使用我的类的存储库
我在php/mysql中查询时使用了此选项,但我希望使用symfony来实现此功能。我将发布一个解决方案,这可能不是最佳性能方案,但它可以工作,您可以进一步优化它 假设:
AcmeBundle
是您的包名称空间,Product
和Media
是您的实体。你需要为你的产品添加一个验证,我已经用过了,你可以更改这个
位于:AcmeBundle\Resources\config\validation.yml
AcmeBundle\Entity\Product:
constraints:
- Callback: { methods: [validate] }
地址:AcmeBundle\Entity\Product
class Product
{
/**
* @var \Doctrine\Common\Collections\Collection
*/
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));
}
}
}
}
好的,如果希望记录是唯一的,那么可以使用实体验证来检查记录是否唯一。假设您有一个用户实体。您希望如果用户的电子邮件或用户名已经存在,那么用户将无法在db上持久化,可以通过检查电子邮件和用户名属性来完成,这意味着它们是否已经存在,这意味着它们是否唯一。有关实体验证的详细信息,请参见以下链接: 更具体地说,如果您想了解Uniquentity validaiton,您可以查看以下链接:
祝你好运,这取决于你检查的目的。如果您有唯一的列,您可以应用验证等。假设我有一个图像位置字段(1,2,3,4,…),单位为DB,对应于产品的图像位置。我不能使用unique,因为我可以为不同的产品设置两个位置1。所以我想检查产品“n”的新图像的位置是否不同。如果nok大于,我将给出一条错误消息。我希望我的解释更准确。那么一个
产品
可以有许多图像
实体?你想确保一个产品内部的图像位置只拍摄一次吗?事实上,一个产品可以有很多图像。此产品的图像位置必须不同/唯一。因此,如果我已经在DB中有一个位置为2的图像,并且我添加了一个新的图像,那么这个位置必须与2不同。谢谢你的建议。