Doctrine2不会选择所有实体字段

时间:2011-11-29 20:30:12

标签: php doctrine-orm

我有Doctrine 2.1实体:

/**
 * @Entity(repositoryClass="Varlab\Model\Repository\UserRepository")
 * @Table(name="user")
 */
class User 
{
/**
 * @Id @Column(name="id",type="integer")
 * @GeneratedValue(strategy="AUTO")
 * 
 * @var integer 
 */
protected $_id;

/**
 * @Column(name="username",type="string",nullable=false,length=50,unique=true)
 * @var string 
 */
protected $_username;

/**
 * User password
 * 
 * @Column(name="passwd",type="string",nullable=false,length=50)
 * @var string 
 */
protected $_password;

/**
 * @ManyToOne(targetEntity="Role")
 * @JoinColumn(name="role_id", referencedColumnName="id")
 * 
 * @var Role 
 */
protected $_role;

/**
 * @ManyToOne(targetEntity="UserStatus")
 * @JoinColumn(name="status_id", referencedColumnName="id")
 * 
 * @var UserStatus 
 */
protected $_status;

/**
 * @Column(name="address",type="string",nullable=false,length=100)
 * @var string
 */
protected $_address;

/**
 * @Column(name="description",type="text",nullable=true)
 * @var string
 */
protected $_description;

/**
 * @Column(name="firstname",type="string",nullable=false,length=50)
 * @var string
 */
protected $_firstname;

/**
 * @Column(name="lastname",type="string",nullable=false,length=50)
 * @var string
 */
protected $_lastname;

/**
 * @Column(name="patronymic",type="string",nullable=false,length=50)
 * @var string
 */
protected $_patronymic;

/**
 * @Column(name="phone",type="string",nullable=false,length=20)
 * @var string
 */
protected $_phone;

// ... some get/set methods here

}

我尝试使用以下代码更新用户实体:

$item = $em->find('User', 1);
$item->setFirstname('some name');
$em->merge($item);
$em->flush();

但是数据库中的firstname字段没有发生任何事情。我查看Doctrine SQL日志,看到该学说不能获取所有字段:

SELECT t0.id AS id1, t0.username AS username2, t0.passwd AS passwd3, t0.role_id AS role_id4, t0.status_id AS status_id5 FROM user t0 WHERE t0.id = ?

如果我尝试更改用户名,则可以在数据库中更改字段。

$item = $em->find('User', 1);
$item->setUsername('some user');
$em->merge($item);
$em->flush();

从Doctrine日志更新SQL:

UPDATE user SET username = ? WHERE id = ?

如何获取实体的所有字段?为什么会这样?

2 个答案:

答案 0 :(得分:4)

默认情况下,Doctrine 2会提取所有字段

问题很可能是以下问题之一:

  • 我不确定merge是否是正确的函数。我很确定它是persist
  • 您的代理可能不是最新的。检查一下。
  • 您的实体元数据可能不是最新的。如果您缓存元数据,请清除缓存并重试。
  • 您的某些映射中存在错误。从命令行工具运行orm:validate-schema

答案 1 :(得分:0)

这是我的错。让我解释原因。

我正在使用Zend 1.1。 +我的项目中的Doctrine 2.1。 Doctrine使用Zend_Cache作为缓存适配器。我忘了在开发环境中禁用缓存。

我的第一个用户模型版本包含4个字段:id,用户名,密码,角色和状态。过了一段时间,我添加了其他字段。 Doctrine在模型元数据中仅缓存了4个字段。 Zend_Cache为缓存文件设置了www-data用户所有者(我无法使用doctrine-cli清除元数据缓存,并且(很奇怪)没有错误)。

我是如何理解问题出在元数据缓存中的?简单 - 我添加了这样的元数据输出:

$item = $em->find('User', 1);
$item->setUsername('some user');
print_r($em->getClassMetadata($item)); // this is it!
$em->merge($item);
$em->flush();

感谢所有帮助我解决这个问题的人。