У меня есть две сущности, Запас и Страна, связанные с отношением «многие к одному».
У обоих есть поле с именем "акроним".
В форме добавления акции отображаются поле Акроним акции и список стран.
При сохранении нового запаса в контроллере произошла ошибка с сообщением «Это значение не должно быть пустым». Похоже, что это вызвано валидатором (NotBlank) из поля аббревиатуры Country.
Два решения на данный момент:
1. переименовать поле акронима Stock в stock_acronym;
2. или удалите валидатор NotBlank для поля аббревиатуры Country.
В обоих случаях это решило проблему, но я бы хотел найти более чистое решение ...
Вот код:
class Stock
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string $acronym
*
* @ORM\Column(name="acronym", type="string", length=10)
* @Assert\MinLength(
* limit=2,
* message="Acronym must have at least {{ limit}} characters."
* )
*/
private $acronym;
/**
* @ORM\ManyToOne(targetEntity="Admin\GeoBundle\Entity\Country", inversedBy="country_stocks")
* @ORM\JoinColumn(name="country_id", referencedColumnName="id")
*/
protected $country;
.....
class Country
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string $country_name
* @Assert\NotBlank()
* @ORM\Column(name="country_name", type="string", length=70)
*/
private $country_name;
/**
* @var string $country_name
* @Assert\NotBlank()
* @ORM\Column(name="acronym", type="string", length=2)
*/
private $acronym;
/**
* @ORM\OneToMany(targetEntity="Admin\GeoBundle\Entity\Stock", mappedBy="country")
* @var ArrayCollection $country_stocks
*/
protected $country_stocks;
.....
StockType:
public function buildForm(FormBuilder $builder, array $options)
{
$builder->add('acronym'); // this is the Stock acronym
$builder->add('country', 'entity', array(
'class' => 'Admin\GeoBundle\Entity\Country',
'property' => 'country_name',
'query_builder' => function (\Admin\GeoBundle\Entity\CountryRepository $repository)
{return $repository->createQueryBuilder('s');}
));
}
.....
Контроллер акций:
/**
* @Route("/admin/stock/add/{id}", name="_admin_stock_add", requirements = {"id" = "\d+"}, defaults={"id" = null})
* @Template()
*/
public function addAction($id)
{
$request = $this->get('request');
$em = $this->get('doctrine')->getEntityManager();
if($id){
$stock = $em->getRepository('AdminGeoBundle:Stock')->find($id);
if (null === $stock){
throw new NotFoundHttpException('The stock to be edited could not be found');
}
}else{
$stock = new \Admin\GeoBundle\Entity\Stock();
}
$form = $this->get('form.factory')->create(new \Admin\GeoBundle\Form\Type\StockType(), $stock);
if ('POST' == $request->getMethod()){
$form->bindRequest($request);
if ($form->isValid()){
if(!$id){
$stock->SetCreated(new \Datetime());
$em->persist($stock);
}
$em->flush();
}else{
var_dump($form->getErrors());
}
}
return $this->redirect($this->generateUrl('_admin_stock'));
}