这是我的实体示例代码。
EntityOne.php
//....
use Symfony'Component'Validator'Constraints as Assert;
use Symfony'Bridge'Doctrine'Validator'Constraints'UniqueEntity;
//....
/**
* EntityOne
*
* @ORM'Table()
* @ORM'Entity(repositoryClass="AppBundle'Entity'EntityOneRepository")
* @UniqueEntity(
* fields={"entityTwo", "number"},
* errorPath="number",
* message="A entityTwo with this number already exists."
* )
*/
class EntityOne
{
//....
/**
* @ORM'ManyToOne(targetEntity="EntityTwo", inversedBy="entityOne")
* @ORM'JoinColumn(name="entitytwo_id", referencedColumnName="id")
*/
protected $entityTwo;
/**
* @var integer
*
* @ORM'Column(name="number", type="integer")
*
* @Assert'NotBlank()
*/
private $number;
//....
}
EntityTwo.php
/**
* EntityTwo
*
* @ORM'Table()
* @ORM'Entity(repositoryClass="AppBundle'Entity'EntityTwoRepository")
*/
class EntityTwo
{
//....
/**
*
* @ORM'OneToMany(targetEntity="EntityOne", mappedBy="entityTwo", cascade={"persist"}, orphanRemoval=true)
* @ORM'OrderBy({"number" = "ASC"})
*/
protected $entityOne;
/**
* @var integer
*
* @ORM'Column(name="totals", type="integer")
*
* @Assert'NotBlank()
*/
private $totals;
//....
}
我使用SonataAdminBundle和实体的常规管理类,一切都很好。
@UniqueEntity的问题在另一个地方。在另一个管理类中,创建EntityOne的记录编号,该编号取决于EntityOne中字段的值。
要做到这一点,我如下所述:
EntityTwoAdmin.php
class EntityTwoAdmin extends Admin {
//....
protected $formOptions = array(
'cascade_validation' => true
);
//....
public function preUpdate($entityTwo) {
$numTotals = $entityTwo->getTotals();
$numEntityOneExist = $entityTwo->getEntityOne()->count();
for ($i = $numEntityOneExist; $i <= $numTotals; $i++) {
$entityOneNew = new 'AppBundle'Entity'EntityOne;
$entityOneNew->setNumber($i);
$entityTwo->addEntityOne($entityOneNew);
}
}
}
这里的记录是在不考虑约束验证的情况下创建的。
我不知道我可能错过了什么,但肯定有一些事情我需要修复。
有什么想法吗?
我设法修复了它,我不清楚这是最好的方法还是没有遵循symfony的最佳实践。
我在这里分享,给那些可以提供帮助的人:
EntityTwoAdmin.php
public function preUpdate($entityTwo) {
$numTotals = $entityTwo->getTotals();
$numEntityOneExist = $entityTwo->getEntityOne()->count();
for ($i = $numEntityOneExist; $i <= $numTotals; $i++) {
$entityOneNew = new 'AppBundle'Entity'EntityOne;
$entityOneNew->setNumber($i);
$entityOneNew->setEntityTwo($entityTwo);
$validator = $this->getConfigurationPool()->getContainer()->get('validator');
$errors = $validator->validate($entityOneNew);
if (count($errors) == 0) {
$entityTwo->addEntityOne($entityOneNew);
}
}
}