【问题标题】:Expected value of type for association field , got "double" instead关联字段类型的预期值,改为“double”
【发布时间】:2018-10-27 04:45:03
【问题描述】:

我想在NumberType 字段中输入一个数字,但是当我得到这个异常时:

关联字段“GestionBundle\Entity\Intervention#$materialCost”的“GestionBundle\Entity\MaterialCost”类型的预期值,改为“double”。

干预

namespace GestionBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\Mapping\OneToOne;

/**
 * @ORM\Entity
 */
class Intervention
{
    /**
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="comments", type="text", nullable=true)
     */
    private $comments;

    /**
     * One Intervention has One materialCost.
     * @OneToOne(targetEntity="MaterialCost", inversedBy="intervention", cascade={"persist"}) 
     */
    private $materialCost;

    public function __toString() {
        if (is_null($this->comments)) {
            return '';
        }
        return $this->comments;
    }
}

材料成本

namespace GestionBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class MaterialCost
{
    /*
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var float
     * @ORM\Column(name="material_cost", type="float")
     */
    private $materialCost;

    /**
     * @ORM\OneToOne(targetEntity="Intervention", mappedBy="materialCost") 
     */
    private $intervention;

    public function __toString() {
        return (string) $this->materialCost;  
    }
}

干预类型

namespace GestionBundle\Form;

use Doctrine\ORM\EntityRepository;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class InterventionType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('materialCost',  NumberType::class, ['required' => true])
                ->add('comments', TextareaType::class, ['required' => false])
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'GestionBundle\Entity\MaterialCost'
        ));
    }
}

【问题讨论】:

  • 表名material_cost和字段相同material_cost,请尝试将字段名更改为另一个。
  • 感谢您的回复,但与其他字段相同

标签: symfony doctrine-orm symfony-forms doctrine-mapping


【解决方案1】:

很明显,您应该将一个对象传递给Intervention 实体对象的materialCost 属性,但是您却给了它一个数字,这是错误的。

我认为你最好完全扔掉MaterialCost实体类并像这样改变InterventionmaterialCost属性映射:

干预

/**
 * Intervention has a materialCost value.
 * @ORM/Column(type="float", name="material_cost") 
 */
private $materialCost;

但是,如果您确定要使用 MaterialCost 实体类,那么您可以这样做:

干预类型

namespace GestionBundle\Form;

use Doctrine\ORM\EntityRepository;
use GestionBundle\Entity\Intervention;
use GestionBundle\Entity\MaterialCost;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class InterventionType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('materialCost',  EntityType::class, [
                'required' => true,
                'class' => MaterialCost::class,
                'choice_label' => 'materialCost',
                ])
            ->add('comments', TextareaType::class, ['required' => false])
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => Intervention::class
        ));
    }
}

这样,您可以选择MaterialCost 的一些实例并将其分配给Intervention。如果您希望能够放入一个新数字,同时创建一个MaterialCost 对象,在InterventionType 表单内,您需要另一个名为prototype 的方法。

考虑阅读How to Embed a Collection of Forms

【讨论】:

  • 是的,就是这样!我太傻了,太明显了。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-08
相关资源
最近更新 更多