我正在使用两个与ManyToMany相关的实体,即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
中的categoryname
和tags
字段:
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
有什么想法吗?
答案 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):
***这是此图像#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;