无法转换属性路径“tagname”的值。期望Doctrine \ Common \ Collections \ Collection对象

时间:2016-07-22 09:39:52

标签: symfony doctrine-orm

我正在使用两个与M​​anyToMany相关的实体,即innodb_stats_sample_pages=142 innodb_stats_persistent_sample_pages=142 innodb_stats_transient_sample_pages=142 innodb_open_files=4000 innodb_additional_mem_pool_size = 16M innodb_buffer_pool_size = 128G innodb_buffer_pool_instances = 8 innodb_data_file_path = ibdata1:10M:autoextend innodb_write_io_threads = 32 innodb_read_io_threads = 32 innodb_thread_concurrency = 16 innodb_flush_log_at_trx_commit = 2 innodb_log_buffer_size =256M innodb_log_file_size = 256M innodb_log_files_in_group = 3 innodb_max_dirty_pages_pct = 90 innodb_lock_wait_timeout = 120 innodb_buffer_pool_load_at_startup = ON innodb_file_format = Barracuda innodb_file_format_max = Barracuda query_cache_type = 0 category

实体tag(相关详情):

Tag

实体类别(相关详情):

/**
 * 
 * @var string
 *
 * @ORM\Column(name="tagname", type="string")
 */
protected $tagname;

/**
 * @ORM\ManyToMany(targetEntity="Category", mappedBy="tags")
 */
protected $categories; 

我有一个带有select-input(CategoryType)和多个select-input(TagType)字段的表单。这两个字段都是EntityType字段。 TagType嵌入在CatgoryType中。

为此,我无法使用/** * * @var string * * @ORM\Column(name="CategoryName", type="string",length=200) */ protected $categoryname; /** * @ORM\ManyToMany(targetEntity="Tag", inversedBy="categories") */ protected $tags; 功能,并在控制器内手动添加提交的标签。提交时,表单数据会在数据库中保留,不会出现任何问题。

问题是,在提交后,当我在控制器中获取提交的类别(及相关标签)并将其传递给表单时,我收到此错误 - cascade=persist

获取的类别对象(Unable to transform value for property path "tagname": Expected a Doctrine\Common\Collections\Collection object.)的var_dump结果为我提供了一个关联的Tag对象的数组,其属性为var_dump($category->getTags()->getValues());

据我所知,protected 'tagname' => string 'tag1'与php数组非常相似,我的猜测是Interface Collection字段需要ArrayCollection或Collection对象格式中的所有tagname。我不确定具体的区别是什么。

但是我仍然无能为力如何在表单中传递已经存在的类别对象。

以下是tagname中的categorynametags字段:

CategoryType

以下是 $builder->add('categoryname', EntityType::class, array( 'class' => 'AppBundle:Category', 'query_builder' => function(EntityRepository $er) { return $er->createQueryBuilder('c') ->orderBy('c.id', 'ASC'); }, 'choice_label' => 'categoryname', 'expanded' => false, 'multiple' => false, 'label' => 'Choose Category', )); $builder->add('tags', CollectionType::class, array( 'entry_type' => TagType::class, 'allow_add' => true, 'by_reference' => false, 'allow_delete' => true, )); 中的嵌入式tagname字段:

TagType

有什么想法吗?

5 个答案:

答案 0 :(得分:0)

抛出的异常非常明确,问题可能在这里:

$builder->add('tagname', EntityType::class, array()

根据您的Tag实体,Tag::$tagname不是实体集合,它是一个字符串。您应该使用

添加属性
$builder->add('tagname', TextType::class, array()

不应该吗?

答案 1 :(得分:0)

尝试以嵌入的形式摆脱'multiple' => true。这对我有用。

答案 2 :(得分:0)

我遇到了类似的问题,其中我的EntityType表单元素给了我此错误消息:

无法反转属性路径“ my_property”的值,需要数组。

将倍数设置为false会使实现无用,因此对我来说更好的选择是将empty_data设置为空数组:

 "empty_data"         => [],

在您的情况下,您可以通过将empty_data设置为Collection来解决该问题,这样可能会起作用:

 "empty_data"         => new ArrayCollection,

答案 3 :(得分:0)

这是您的操作方式(来源:https://www.youtube.com/watch?v=NNCpj4otnrc):

enter image description here

enter image description here

enter image description here

***这是此图像#1的文本版本,之所以我没有添加文本是因为格式不正确时很难阅读!

<?php

namespace App\Form;

use App\Entity\Post;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TextType;

class PostType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title', TextType::class, [
                'attr' => [
                    'placeholder' => 'Etner the title here',
                    'class' => 'custom_class'
                ]
            ])
            ->add('description', TextareaType::class, [
                'attr' => [
                    'placeholder' => 'Enter teh description here',
                ]
            ])
            ->add('category', EntityType::class, [
                'class' => 'App\Entity\Category'
            ])
            ->add('save', SubmitType::class, [
                'attr' => [
                    'class' => 'btn btn-success'
                ]
            ])
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Post::class,
        ]);
    }
}

***这是此图像#2的文本版本,之所以我没有添加文本是因为格式不正确,很难阅读!

class FormController extends AbstractController
{
/**
 * @Route("/form", name="form")
 * @param Request $request
 * @return Response
 */
public function index(Request $request)
{
    $post = new Post(); // exit('this');
    /*$post->setTitle('welcome');
    $post->setDescription('description here');*/
    $form = $this->createForm(PostType::class, $post, [
        'action' => $this->generateUrl('form'),
        'method' => 'POST'
    ]);

    // handle the request
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid())
    {
        // var_dump($post); die();
        // save to database
        $em = $this->getDoctrine()->getManager();
        $em->persist($post);
        $em->flush();
    }

    return $this->render('form/index.html.twig', [
        'postaform' => $form->createView()
    ]);
}

答案 4 :(得分:0)

我的假设是错误的,我需要将tagname字段设置为数组,或者与其他任何实体创建ManyToOne或ManyToMany关系,以便可以将其作为arraycollection。只有这样,才可以将标记名用作多选字段。

/**
 * 
 * @var array
 *
 * @ORM\Column(name="tagname", type="array")
 */
protected $tagname;

/**
 * @ORM\ManyToMany(targetEntity="SOME_ENTITY", mappedBy="SOME_PROPERTY")
 */
protected $tagname;

/**
 * @ORM\ManyToOne(targetEntity="SOME_ENTITY", mappedBy="SOME_PROPERTY")
 */
protected $tagname;