【问题标题】:symfony 3 form entity returning converting errorsymfony 3 表单实体返回转换错误
【发布时间】:2017-03-13 10:25:56
【问题描述】:

我的表单返回以下错误:

执行 'UPDATE user_info SET 时发生异常 country_of_residence = ?, want_children = ?, 工资 = ?哪里 id = ? 带参数 [{}, "a", "0", 22]:

可捕获的致命错误:AppBundle\Entity\Country 类的对象可能 不能转成字符串

我的用户信息类型:

<?php
// src/AppBundle/Form/UserInfoType.php
namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType; 

class UserInfoType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('first_name', TextType::class, array('label' => 'Prénom'))
            ->add('surname', TextType::class, array('label' => 'Nom'))
            ->add('nationality', TextType::class, array('label' => 'Nationalité'))
            ->add('country_of_residence', EntityType::class, array(
                'class' => 'AppBundle:Country',
                'choice_label' => 'name',                   
            ))
            ->add('maritial_status', TextType::class, array('label' => 'Votre statut maritial'))
            ->add('ethnique_origin', TextType::class, array('label' => 'Origine ethinique'))
            ->add('spoken_language', TextType::class, array('label' => 'Langues parlés'))
            ->add('children', TextType::class, array('label' => 'Possèdez vous des enfants'))
            ->add('want_children', TextType::class, array('label' => 'Désirez vous des enfants'))
            ->add('astrological_sign', TextType::class, array('label' => 'Votre signe astrologique'))
            ->add('education', TextType::class, array('label' => 'Votre niveau d\'étude'))
            ->add('profession', TextType::class, array('label' => 'Votre profession'))
            ->add('salary', TextType::class, array('label' => 'Votre salaire'))
            ->add('save', SubmitType::class, array('label' => 'Suivant'))
        ;

    }

我的国家实体:

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Country
 *
 * @ORM\Table(name="country")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\CountryRepository")
 */
class Country
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="code", type="string", length=255)
     */
    private $code;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255)
     */
    private $name;

    /**
     * @var string
     *
     * @ORM\Column(name="language", type="string", length=255)
     */
    private $language;


    /**
     * Get id
     *
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set code
     *
     * @param string $code
     *
     * @return Country
     */
    public function setCode($code)
    {
        $this->code = $code;

        return $this;
    }

    /**
     * Get code
     *
     * @return string
     */
    public function getCode()
    {
        return $this->code;
    }

    /**
     * Set name
     *
     * @param string $name
     *
     * @return Country
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    /**
     * Get name
     *
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Set language
     *
     * @param string $language
     *
     * @return Country
     */
    public function setLanguage($language)
    {
        $this->language = $language;
        return $this;
    }

    /**
     * Get language
     *
     * @return string
     */
    public function getLanguage()
    {
        return $this->language;
    }
}

我的配置文件控制器:

/**
 * @Route("/survey/{slug}", name = "survey_render" )
 */
public function renderSurvey($slug, Request $request)
{
    $user = $this->getUser();   
    $em = $this->getDoctrine()->getManager();
    $user_info = $em->getRepository('ProfileBundle:UserInfo')->findOneBy(array('userId' => $user->getId()));
    if (!$user_info) {
        $user_info = new UserInfo();
        $user_info->setuserId($user->getId());
    }

    $user_pref = $em->getRepository('ProfileBundle:UserPreference')->findOneBy(array('userId' => $user->getId()));

    if (!$user_pref) {
        $user_pref = new UserPreference();
        $user_pref->setuserId($user->getId());
    }

    //$user_info = new UserInfo();

    switch ($slug) {
        case 'vos_infos':


            $form = $this->createForm(UserInfoType::class, $user_info );
            break;
        case 'votre_apparance':
            $form = $this->createForm(UserAppearanceType::class, $user_info);   
            break;
        case 'votre_style_vie':
            $form = $this->createForm(UserLifeStyleType::class, $user_info);    
            break;
        case 'ses_infos':
            $form = $this->createForm(UserPrefInfoType::class, $user_pref);
            break;
        case 'son_apparence':
            $form = $this->createForm(UserPrefAppearanceType::class, $user_pref);
            break;
        case 'son_style_vie':
            $form = $this->createForm(UserPrefLifeStyleType::class, $user_pref);
            break;
        case 'votre_quiz':
            $form = $this->createForm(UserLifeStyleType::class, $user_pref);
            break;
        default;
            echo 'Lien incorrect';
            break;
    }

    $form->handleRequest($request);
    if ($form->isSubmitted() && $form->isValid()) {
        $form_data = $form->getData();
        $em = $this->getDoctrine()->getManager();
        $em->persist($form_data);
        $em->flush();   

似乎它试图将整个实体传递给表单,而不仅仅是选择结果。

有人知道我在这里做错了什么吗?

谢谢

【问题讨论】:

  • 您的 User 或 UserInfo 实体是什么样的?

标签: forms symfony entity


【解决方案1】:

好的,我在 UserInfo 中发现了错误。

我没有预先添加@ORM,也没有到 Country 实体的正确路径(它不在同一个命名空间中)

之前:

 /**
 * One Product has One Shipping.
 * @OneToOne(targetEntity="Country")
 * @JoinColumn(name="countryOfResidence", referencedColumnName="id")
 */
private $countryOfResidence;

之后:

/**
     * One Product has One Shipping.
     * @ORM\OneToOne(targetEntity="AppBundle\Entity\Country")
     * @ORM\JoinColumn(name="countryOfResidence", referencedColumnName="id")
     */
    private $countryOfResidence;

感谢您为我指明正确的方向。

【讨论】:

  • 谢谢@Yex777,这帮助我更快地找到答案。
【解决方案2】:

如果 user_info 是一个实体,您是否已将 country_of_residence 字段设置为国家实体的一对一关系?

【讨论】:

    【解决方案3】:

    我遇到了相同类型的错误。就我而言,这是“拥有”实体中的错误注释。

    之前(导致错误):

    /** 
     * @ORM\OneToOne(targetEntity="RfpMatchBundle\Entity\Address", cascade={"persist"})
     * @ORM\Column(nullable=true, unique=false)
     */
    private $address;
    

    之后(固定):

    /** 
     * @ORM\OneToOne(targetEntity="RfpMatchBundle\Entity\Address", cascade={"persist"})
     */
    private $address;`
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-26
      • 1970-01-01
      • 1970-01-01
      • 2015-11-01
      • 1970-01-01
      • 2018-02-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多