Php symfony集合中的实体主键
我正在学习symfony 3&doctrine,我用实体集合创建了一个表单。实体是具有多个关系的Post和标记。主要形式是带有标签集合的Post。 我只想传递集合中标记的ID(主键)。因此,我在标记形式中只有一个字段:Php symfony集合中的实体主键,php,forms,doctrine-orm,symfony,Php,Forms,Doctrine Orm,Symfony,我正在学习symfony 3&doctrine,我用实体集合创建了一个表单。实体是具有多个关系的Post和标记。主要形式是带有标签集合的Post。 我只想传递集合中标记的ID(主键)。因此,我在标记形式中只有一个字段: $builder->add('tagId'); 我为它创建了自动完成,这就是为什么我只需要主键。 保存表单后,我将使用传递的ID创建新的标记实体,但我希望找到这些实体,而不是创建新的标记实体。没有线索 我试图让它在我的控制器内工作: $formTags = $form-&
$builder->add('tagId');
我为它创建了自动完成,这就是为什么我只需要主键。
保存表单后,我将使用传递的ID创建新的标记实体,但我希望找到这些实体,而不是创建新的标记实体。没有线索
我试图让它在我的控制器内工作:
$formTags = $form->get('tag');
foreach ($formTags->getData() as $key => $formTag)
{
// here i have new entities with id ;/
if($formTag->getTagId())
{
// so i tryied to find them, and replace it
$formTags->offsetSet($key,
array($this->getDoctrine()->getRepository('BlogBundle:Tag')
->find($formTag->getTagId())));
}
}
但是symfony会抛出异常,同样是setData方法。提交表单后无法更改它。我希望你们能帮助我
我想做一个数据转换器。忘记提及:)问题是我的转换器将tagId字段更改为tag对象。结果,我用新的实体标记了对象,取而代之的是tagId值——里面还有另一个对象,transformed。所以不要像我期望的那样工作。我想我应该为收集字段而不是标记id制作transformer,但我不知道如何使它工作。我试图在集合中创建“tag”字段并对其进行转换,但我总是尝试根据字段从实体中获取值,因此找不到getTag()方法:)您可以在标记类型中使用Symfony DataTransformer将标记ID转换为标记实体 来自Symfony: 数据转换器用于将字段的数据转换为可在表单中显示的格式(并在提交时返回) 假设任务实体与问题实体之间存在多对一关系(即,每个任务的相关问题都有一个可选外键)。添加一个包含所有可能问题的列表框最终可能会非常长,并且需要很长时间才能加载。相反,您决定添加一个文本框,用户只需在其中输入发行号即可
我成功了。使用数据转换器,但我们需要制作用于采集的转换器,而不是用于采集内部的字段 所以看起来是这样的(行得通!) 我的PostType.php表单需要有实体管理器(如内部文档,关于数据转换器)和用于收集的数据转换器,因此我添加了:
# PostType.php form
namespace BlogBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Doctrine\ORM\EntityRepository;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use BlogBundle\Form\DataTransformer\TagToIdTransformer;
use Doctrine\Common\Persistence\ObjectManager;
class PostType extends AbstractType
{
private $manager;
public function __construct(ObjectManager $manager)
{
// needed for transformer :(
// and we need to register service inside app config for this. Details below
$this->manager = $manager;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('tag', CollectionType::class, array(
'entry_type' => TagType::class,
'by_reference' => false,
'allow_add' => true,
))
->add('save', SubmitType::class, array('label' => 'Save'));
$builder->get('tag')
->addModelTransformer(new TagToIdTransformer($this->manager));
}
}
构造函数将抛出异常,我们需要将ObjectManager传递给它。为此,请修改捆绑包中的配置文件:
# src/BlogBundle/Resources/config/services.yml
services:
blog.form.type.tag:
class: BlogBundle\Form\PostType
arguments: ["@doctrine.orm.entity_manager"]
tags:
- { name: form.type }
现在让我们制作一个集合的变压器!我以前犯过错误,因为我试图为一个字段制作类似内部文档的文档。对于集合,我们需要转换整个标记数组(它的许多集合):
我以前做过。忘记提及:)问题是我的转换器将tagId字段更改为tag对象。在结果中,我使用新实体隐藏对象,没有tagId值-其中有另一个对象,已转换。我想我应该为收集字段而不是标记id制作transformer,但我不知道如何使它工作。我试图在集合中创建“tag”字段并对其进行转换,但doctrine总是试图从基于字段的实体中获取值,所以找不到getTag()方法:)使其。。。最后,谢谢你的回答。这是很有帮助的,因为我很快就可以在没有数据转换器的情况下工作了(非常糟糕),但在你的帖子发布后,我越来越多地尝试使用它,现在可以工作了你让我开心!这就是我的解决方案
<?php
namespace BlogBundle\Form\DataTransformer;
use BlogBundle\Entity\Tag;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\Form\DataTransformerInterface;
use Symfony\Component\Form\Exception\TransformationFailedException;
class TagToIdTransformer implements DataTransformerInterface
{
private $manager;
public function __construct(ObjectManager $manager)
{
$this->manager = $manager;
}
/**
* Transforms array of objects (Tag) to an array of string (number).
*
* @param array|null $tags
* @return string
*/
public function transform($tags)
{
$result = array();
if (null === $tags) {
return null;
}
foreach ($tags as $tag)
{
$result[] = $tag->getTagId();
}
return $result;
}
/**
* Transforms an array of strings (numbers) to an array of objects (Tag).
*
* @param string $tagsId
* @return Tag|null
* @throws TransformationFailedException if object (Tag) is not found.
*/
public function reverseTransform($tagsId)
{
// no issue number? It's optional, so that's ok
if (!$tagsId) {
return;
}
$result = array();
$repository = $this->manager
->getRepository('BlogBundle:Tag');
foreach ($tagsId as $tagId) {
$tag = $repository->find($tagId);
if (null === $tag) {
// causes a validation error
// this message is not shown to the user
// see the invalid_message option
throw new TransformationFailedException(sprintf(
'An tag with id "%s" does not exist!',
$tagId
));
}
$result[] = $tag;
}
return $result;
}
}