几分钟前,我在Doctrine2中发现了一个错误。
我在实体中添加了一些字段,然后刷新mysql表,并将其持久化。我注意到新数据没有存储在表中。
尝试了一个var_dump(值为"->getXXX()"),结果是正确的。
这是使用的代码:
$user->setName($name);
$user->setSurname($surname);
if($country)
$user->setCountry($country->getId());
//New code
if($province > 0)
$user->setProvince($province);
if($town > 0)
$user->setTown($town);
var_dump($user->getProvince(), $user->getTown()); //Works OK
$em->persist($user); // Only persists values before Province.
$em->flush();
谢谢和问候!
编辑
关于我的实体的信息:
class Users
{
/**
* @var integer $id
*
* @ORMColumn(name="id", type="bigint")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string $name
*
* @ORMColumn(name="name", type="string", length=50)
*/
private $name;
/**
* @var string $surname
*
* @ORMColumn(name="surname", type="string", length=95)
*/
private $surname;
/**
* @var string $mail
*
* @ORMColumn(name="mail", type="string", length=80, unique=true)
*/
private $mail;
/**
* @var string $password
*
* @ORMColumn(name="password", type="string", length=255)
*/
private $password;
/**
* @var $country
*
* @ORMColumn(name="country", type="integer")
*/
private $country;
/**
* @var $province
*
* @ORMColumn(name="province", type="integer")
*/
private $province;
/**
* @var $town
*
* @ORMColumn(name="town", type="integer")
*/
private $town;
}
国家、省和城镇是来自同名表的id。我曾尝试使用ManytoOne关联来更改字段的类型,但它在Doctrine2生成的SQL中出错。这似乎是一个缓存错误,但我无法解决。
在使用doctrine:schema:update
时,我在Doctrine方面也遇到过同样的问题。和@lifo一样,我不得不重新启动apache。不同的是,我没有运行apc,所以我认为Doctrine为模型做了一些内部缓存。
$ apachectl -M | grep apc
Syntax OK
关于条令关联是如何工作的,您有很多东西需要学习。我建议花点时间仔细阅读条令映射文档。
用户实体不应该使用这样的整数。您可能希望这些用户具有ManyToOne
关系(意思是:每个用户只能有一个国家和一个省)。您应该开始将事物视为对象,并尽量不要传递ID的
例如:
/**
* @ORMManyToOne(targetEntity="Country")
* @ORMJoinColumn(name="countryId", referencedColumnName="id")
*/
private $country;
/**
* @ORMManyToOne(targetEntity="Province")
* @ORMJoinColumn(name="provinceId", referencedColumnName="id")
*/
private $province;
每一个中的targetEntity
都应该更改为实体的名称。
如果尝试进行这些更改,请确保运行app/console doctrine:schema:update
命令以自动更新架构。
然后你可以在你的控制器中这样做:
$country = new Country('US');
$entityManager->persist($country);
$user->setCountry($country);
注意:我没有将国家ID分配给setCountry()
方法。我传入实际的Country
对象。这只是一个例子,在您的实际控制器中,这里的$country
变量将通过表格传入或从数据库中提取,等等。