Php Symfony2,Doctrine2在关联sth#类别上找到了DOCTRIN\Common\Collections\ArrayCollection类型的实体,但应为sth

Php Symfony2,Doctrine2在关联sth#类别上找到了DOCTRIN\Common\Collections\ArrayCollection类型的实体,但应为sth,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,现在我在表单中提交帖子数据时遇到问题(我的表单如下所示: Task: <input text> Category: <multiple select category> DueDate: <date> <submit> 我的资料来源: 任务对象Task.php 所以,我在谷歌上看到了这个问题,但是有不同类型的问题。你知道吗 更新 完整错误消息: [2013-09-30 14:43:55] request.CRITICAL: Uncaught PH

现在我在表单中提交帖子数据时遇到问题(我的表单如下所示:

Task: <input text>
Category: <multiple select category>
DueDate: <date>
<submit>
我的资料来源: 任务对象Task.php

所以,我在谷歌上看到了这个问题,但是有不同类型的问题。你知道吗

更新 完整错误消息:

[2013-09-30 14:43:55] request.CRITICAL: Uncaught PHP Exception Doctrine\ORM\ORMException: "Found entity of type Doctrine\Common\Collections\ArrayCollection on association Acme\TaskBundle\Entity\Task#category, but expecting Acme\TaskBundle\Entity\Category" at /var/www/Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php line 762 {"exception":"[object] (Doctrine\\ORM\\ORMException: Found entity of type Doctrine\\Common\\Collections\\ArrayCollection on association Acme\\TaskBundle\\Entity\\Task#category, but expecting Acme\\TaskBundle\\Entity\\Category at /var/www/Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php:762)"} []
更新2

我的小枝模板new.html.TWIG


任务创建
{app.session.flashbag.get('success')%%中flashMessage的%
{{flashMessage}}
{%endfor%}
{form_start(form,{'action':path('task_new'),'method':'POST','attr':{'novalidate':'novalidate'}}}}
{{form_errors(form)}}
{{form_label(form.task)}}:
{{form_小部件(form.task)}{{form_错误(form.task)}}}
{{form_label(form.category)}}:
{{form_小部件(form.category)}{{form_错误(form.category)}} {{form_label(form.dueDate)}:
{{form_小部件(form.dueDate)}{{form_错误(form.dueDate)}}
{{form_end(form)}}
我不确定,但请尝试将setCategory方法添加到任务实体中,因为当前您只有add函数,这就是为什么表单组件调用addFunction而不是整个arraycollection的set。

我认为表单中存在问题

您的任务与category有很多关系,并存储在字段
category
(逻辑上它是一个categories)。但是以您设置'->add('category',new CategorityType())'的形式,这意味着您添加了一个数组或其他内容的新类型(data_class未定义),并且该类型包含另一个字段


解决方案是直接在表单中定义字段(不使用独立表单类型)或从实体类型扩展类别表单类型(默认类型为扩展表单类型).

您正在定义任务与类别之间的多个关系,这意味着您可以为每个任务定义多个类别。如果您试图在一个任务中包含多个类别,您可以尝试更改此行

->add('category', new CategoryType(), array('validation_groups' => array('adding')))
比如

->add('category', 'collection', array('type' => new CategoryType()))

查看和上的symfony文档,我找到了我的解决方案!此代码有效:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('task', 'text', array('label' => 'Task'))
            ->add('dueDate', 'date', array('label' => 'Date', 'format' => 'ddMMMMyyyy'))
            ->add('category', 'entity', array('required' => true, 'multiple' => true, 'class' => 'AcmeTaskBundle:Category', 'query_builder' => function($repository) { return $repository->createQueryBuilder('c')->orderBy('c.id', 'ASC'); },))
            ->add('save', 'submit', array('label' => 'Send'));
}
我的控制器以这种形式工作:

if($form->isValid())
{
    $this->get('session')->getFlashBag()->add(
        'success',
        'Task successfuly added'
    );
    $em = $this->getDoctrine()->getManager();
    foreach($form->get('category')->getData() as $cat)
    {
        $task->removeCategory($cat);
        $task->addCategory($cat);
    }
    $em->persist($task);
    try {
        $em->flush();
    } catch (\PDOException $e) {
        // sth
    }
}
我被迫使用
$task->removeCategory($cat)
,因为如果duapplication主索引不在这里,我将得到它的错误

现在我正试图解决嵌入和非嵌入表单的问题->


我相信我的问题将有助于Symfony2初学者解决同样的问题。

您可以通过更改实体中的设置器来改进控制器代码:

任务中

公共功能添加类别(类别$Category)
{
如果(!$this->categories->contains($category)){
$this->categories->add($categority);
$category->addTask($this);//修复此问题
}
}
类别中

公共函数addTask(任务$Task)
{
如果(!this->tasks->包含($task)){
$this->tasks->add($task);
$task->addCategory($this);
}
}

这将使
ArrayCollection
中的元素保持唯一性,这样您就不必签入代码,而且还将自动设置反方向。

我应该为这个方法编写什么?
public function setCategory($categories){$This->categories=$categories}
我想你的意思是
公共函数setCategory(\Acme\TaskBundle\Entity\Category$Category){$this->Category=$Category;}
因为我不使用propery$categories,但它没有帮助。不,我实际上是指我写的内容。请尝试从函数中删除该类型,因为$this->categories不是单个类别,而是一个类别集合。是的,我称它为$category而不是$categories,我知道它不是单个类别。请在此处添加Stacktrace,好吗错误来自?请参阅我更新的问题(底部),您是否可以检查$task->getCategory()中的对象/集合类型如果表单组件正在使用task::addCategory或task::setCategory方法,则可能会在任务中进行调试。如果表单处于验证状态,则会在该方法之前引发异常如果我使用data_类,则会在呈现页面开始时收到错误消息。错误消息类似于current-ArrayCollection get,预期的类别实体。以及你能给我举个例子吗?我如何扩展表单类型(在我的案例中是类别)?您好,如果我这样做,我会在我的分类表单小部件中获得一个空白位置。
分类:
您可以添加您的细枝模板吗?您应该在细枝文件中添加一些内容来添加您的分类。您应该向集合容器中添加一个原型…尝试以下操作:
{{form label(form.category)}:
{%forform.category%}
  • {{form_row(category.name)}
  • {%endfor%}
    呈现表单后,我有0个DB查询。从DB中选择类别应为1。
    public function newAction(Request $request)
    {
        $task = new Task();
        $task->setTask('Write name here...');
        $task->setDueDate(new \DateTime('tomorrow'));
    
        $form = $this->createForm('task', $task);                   
        $form->handleRequest($request);
    
        if($form->isValid())
        {
            $this->get('session')->getFlashBag()->add(
                'success',
                'Task was successfuly created'
            );
            $em = $this->getDoctrine()->getManager();
            /*
            $category = $this->getDoctrine()->getManager()->getRepository('AcmeTaskBundle:Category')->findOneByName($form->get('category')->getData());
            $task->setCategory($category);
            */
            $em->persist($task);
            try {
                $em->flush();
            } catch (\PDOException $e) {
                // sth
            }
    
            //$nextAction = $form->get('saveAndAdd')->isClicked() ? 'task_new' : 'task_success';
    
            //return $this->redirect($this->generateUrl($nextAction));
        } 
    
        return $this->render('AcmeTaskBundle:Default:new.html.twig', array('form' => $form->createView()));
    }
    
    [2013-09-30 14:43:55] request.CRITICAL: Uncaught PHP Exception Doctrine\ORM\ORMException: "Found entity of type Doctrine\Common\Collections\ArrayCollection on association Acme\TaskBundle\Entity\Task#category, but expecting Acme\TaskBundle\Entity\Category" at /var/www/Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php line 762 {"exception":"[object] (Doctrine\\ORM\\ORMException: Found entity of type Doctrine\\Common\\Collections\\ArrayCollection on association Acme\\TaskBundle\\Entity\\Task#category, but expecting Acme\\TaskBundle\\Entity\\Category at /var/www/Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php:762)"} []
    
    <html>
    <head>
    <title>Task create</title>
    </head>
    <body>
    {% for flashMessage in app.session.flashbag.get('success') %}
    <div style="display: block; padding: 15px; border: 1px solid green; margin: 15px; width: 450px;">
    {{ flashMessage }}
    </div>
    {% endfor %}
    
    {{ form_start(form, {'action': path ('task_new'), 'method': 'POST', 'attr': {'novalidate': 'novalidate' }}) }}
      {{ form_errors(form) }}
    
      <div>
        {{ form_label(form.task) }}:<br>  
        {{ form_widget(form.task) }} {{ form_errors(form.task) }}<br>
      </div>
      <div>
        {{ form_label(form.category) }}:<br>
        {{ form_widget(form.category) }} {{ form_errors(form.category) }}   
      </div>
      <div>
        {{ form_label(form.dueDate) }}:<br>
        {{ form_widget(form.dueDate) }} {{ form_errors(form.dueDate) }}<br>
      </div>
    
    {{ form_end(form) }}
    </body>
    </html>
    
    ->add('category', new CategoryType(), array('validation_groups' => array('adding')))
    
    ->add('category', 'collection', array('type' => new CategoryType()))
    
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('task', 'text', array('label' => 'Task'))
                ->add('dueDate', 'date', array('label' => 'Date', 'format' => 'ddMMMMyyyy'))
                ->add('category', 'entity', array('required' => true, 'multiple' => true, 'class' => 'AcmeTaskBundle:Category', 'query_builder' => function($repository) { return $repository->createQueryBuilder('c')->orderBy('c.id', 'ASC'); },))
                ->add('save', 'submit', array('label' => 'Send'));
    }
    
    if($form->isValid())
    {
        $this->get('session')->getFlashBag()->add(
            'success',
            'Task successfuly added'
        );
        $em = $this->getDoctrine()->getManager();
        foreach($form->get('category')->getData() as $cat)
        {
            $task->removeCategory($cat);
            $task->addCategory($cat);
        }
        $em->persist($task);
        try {
            $em->flush();
        } catch (\PDOException $e) {
            // sth
        }
    }