更新:这不仅仅是username
影响。我甚至尝试将列重命名为我的架构中的foo
,但仍然会为该列返回null
!
我的数据库在MySQL(InnoDB)中。我有一个users
表,其中包含属性ID
,username
,name
,email
,password
。表中插入了一堆用户。
在Doctrine方面,我的AppBundle\Entity\User
类已正确定义。我可以查询我的用户并获取他们的列表,所有列都保持不变 - 除了username
列。
尽管在PHP中定义了username
:
/**
* User
*
* @ORM\Table(name="user", uniqueConstraints={@ORM\UniqueConstraint(name="username_UNIQUE", columns={"username"})})
* @ORM\Entity
*/
class User
{
/**
* @var string
*
* @ORM\Column(name="username", type="string", length=45, nullable=false)
*/
private $username;
// ...
/**
* Set username
*
* @param string $username
*
* @return User
*/
public function setUsername($username)
{
$this->username = $username;
return $this;
}
/**
* Get username
*
* @return string
*/
public function getUsername()
{
return $this->username;
}
当我获取实体并转储它们时,用户名字段被神秘地取消了:
User {#389 ▼
-id: 2
-username: null
-name: "Sam"
-password: XXX
-email: XXX
-oPhone: ""
-mPhone: XXX
-hPhone: ""
-institutions: PersistentCollection {#390 ▶}
}
即使它确实存在并且在数据库上不为空:
mysql> SELECT * FROM user WHERE id=2
# ID, username, name, password, email, o_phone, m_phone, h_phone
2, sjw, Sam, XXX, XXX, , XXX,
尝试通过PHP访问该字段导致它抱怨没有这样的username
字段存在,阻止我使用此实体进行用户身份验证。
我没有在PHP 5.4上使用Symfony中的任何自定义应用程序包,版本为2.7.6(带有doctrine2)。
我已经清除了我的缓存,确保我没有任何Doctrine生成的.yml或.xml模型。
我已经检查了我的数据库 - 使用sqlalchemy Python库和sqlacodegen
我有一个我的ORM的python版本。 username
列没有问题,结果显示为应该,而不是null或NoneType。
我暂时禁用了SecurityBundle以查看它是否正在删除幕后的用户名 - 该字段仍然无效。
我仔细阅读了Symfony文档...
没有,出于想法。 Symfony在幕后做什么?
答案 0 :(得分:0)
事实证明这是一个缓存问题,正如chosen answer here所解释的那样。我完全忘记了我已经启用了APC来缓存数据库条目!事实证明它还缓存了数据库元数据和各种代码,因此即使我清除了其他所有内容,APC缓存也没有得到更新。
这是罪魁祸首,config.yml
中的这些行应该只有 <{1}}:
config_prod.yml
(另一个解决方案可能只是重新启动 doctrine:
orm:
metadata_cache_driver: apc
result_cache_driver: apc
query_cache_driver: apc
,因为这就是我在我的环境中运行PHP的方式 - 这可能需要一秒钟才能完成,但我没有考虑整体两天......呃...)