2011-11-29 37 views
0

我有學說2.1實體:Doctrine2不選擇所有的實體領域

/** 
* @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(); 

但沒有什麼是發生在數據庫名字字段。我看着主義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(); 

更新SQL:

UPDATE user SET username = ? WHERE id = ? 

我怎樣才能獲取我的實體的各個領域?爲什麼這樣?

+0

你能展示你用來更新「用戶名」的代碼嗎?第一遍我無法檢測到問題。 – cantera

+0

我添加了更改數據庫中用戶名字段的代碼 –

回答

4

學說2取所有字段默認爲

最有可能的問題是下列之一:

  • 我不知道,如果是merge使用正確的功能。我很確定這是persist
  • 您的代理可能不是最新的。檢查他們。
  • 您的實體元數據可能不是最新的。如果您緩存元數據,請清除緩存並重試。
  • 在您的某些映射中存在錯誤。從命令行工具運行orm:validate-schema
+0

您是對的。這是緩存問題。 –

0

這是我的錯。讓我解釋一下爲什麼。

我正在使用Zend 1.1。 +我的項目中的學說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(); 

感謝大家幫助我解決這個問題。

相關問題