我创建了一个看似正确的表单,它有一些文本字段和一个选择框,其中包含从我所拥有的国家/地区表中提取的国家/地区列表。使用正确的值“值”和显示文本正确显示选择框。当我提交表格时,我得到一个例外:
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'));
}
那里的echo返回国家对象的__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;
}
答案 0 :(得分:2)
正在发生的事情是表单正在向Duck发送一个实际的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;
并相应地调整你的吸气剂/设定者。
你似乎同时拥有yml和注释,这有点奇怪。根据我的理解,你可以在给定的捆绑中使用其中一个。