0

我创建了一个看起来正确的表单,它有几个文本字段和一个选择框,其中包含从我拥有的国家/地区表中提取的国家/地区列表。选择框使用正确的“值”值正确显示并显示文本。但是,当我提交表单时,出现异常:

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'countryid' cannot be null 

如果我将数据库表(在 PHPMyAdmin 中)设置为允许 countryid 字段为空值,它会毫无例外地输入记录,但 countryid 的条目为空。

我的控制器有以下代码:

        $duck = new \Wfuk\DuckBundle\Entity\Ducks();

    $form = $this->createFormBuilder($duck)
       ->add('city', 'text')
       ->add('countryid', 'entity', array('class' => 'WfukDuckBundle:Country', 'property' => 'country'))
       // cut other fields
       ->getForm();

    if ($request->getMethod() == 'POST') {
        $form->bindRequest($request);

    $errors = $this->get('validator')->validate( $form );

    echo $duck->getCountryid();

    if ($form->isValid()) {
        $em = $this->getDoctrine()->getEntityManager();
        $em->persist($duck);
        $em->flush();
        return $this->redirect($this->generateUrl('upload_duck_success'));
        }

那里的回声返回国家对象的 __toString 函数,这似乎有点奇怪 - 但它是表格中选择的国家的完整国家信息。

在 Ducks.php 类中:

 /**
 * @var string $countryid
 *
 * @ORM\Column(name="countryid", type="string", length=2, nullable=false)
 */
private $countryid;

/**
 * Set countryid
 *
 * @param string $countryId
 */
public function setCountryid($countryid)
{
    $this->countryid = $countryid;
}

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

这是我的第一个 symfony 项目,但我已经看过文档好几次了,我认为我的一切都设置好了……

编辑:

我有一个加入设置如下:Ducks.php

/**
 * @ORM\ManyToOne(targetEntity="Country", inversedBy="ducks")
 * @ORM\JoinColumn(name="countryid", referencedColumnName="id")
 */
private $country;

/**
 * Set country
 *
 * @param string $country
 */
public function setCountry($country)
{
    $this->country = $country;
}

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

在 Country.php 方面:

/**
 * @ORM\OneToMany(targetEntity="Ducks", mappedBy="country")
 */
protected $ducks;

public function __construct()
{
    $this->ducks = new ArrayCollection();
}

/**
 * Get ducks
 *
 * @return Doctrine\Common\Collections\Collection 
 */
public function getDucks()
{
    return $this->ducks;
}
4

1 回答 1

2

发生的事情是表单正在向鸭子发送一个实际的 Country 对象。您可以通过以下方式确认:

public function setCountryid($countryid)
{
    if (is_object($countryid)) die('Yep, got a country object.');
    $this->countryid = $countryid;
}

听起来您只想存储 2 个字符的国家/地区代码?你不想要一个真正的关系?如果是这样,那么这可能会奏效:

public function setCountryid($countryid)
{
    if (is_object($countryid)) $countryid = $countryid->getId();
    $this->countryid = $countryid;
}

如果你想在鸭子和国家之间建立一个真正正常的 Doctrine 管理关系,那么就像:

/**
 * @ORM\ManyToOne(targetEntity="Country")
 * @ORM\JoinColumn(name="country_id", referencedColumnName="id")
 */
 */
private $country;

并相应地调整你的 getter/setter。

您似乎同时拥有 yml 和注释,这有点奇怪。据我了解,您可以在给定的捆绑包中使用其中一个。

于 2012-04-12T00:56:21.780 回答