Doctrine2 не выбирает все поля сущностей - PullRequest
0 голосов
/ 30 ноября 2011

У меня есть сущность Доктрины 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();

Но ничего не произошло с полем имени в базе данных. Я смотрю на журнал 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();

Обновление SQL из журнала Doctrine:

UPDATE user SET username = ? WHERE id = ?

Как я могу получить все поля моей сущности? Почему это так?

Ответы [ 2 ]

4 голосов
/ 30 ноября 2011

Doctrine 2 извлекает все поля по умолчанию.

Скорее всего, проблема заключается в следующем:

  • Я не уверен, если merge правильная функция для использования.Я уверен, что это persist
  • Ваши прокси могут быть не в курсе.Проверьте их.
  • Возможно, ваши метаданные сущности не актуальны.Если вы кешируете свои метаданные, очистите кеш и попробуйте снова.
  • В некоторых ваших сопоставлениях есть ошибка.Запустите orm: validate-schema из инструмента командной строки
0 голосов
/ 30 ноября 2011

Это моя вина. Позвольте мне объяснить, почему.

Я использую Zend 1.1. + Учение 2.1 в моем проекте. Doctrine использует Zend_Cache в качестве адаптера кеша. Я забыл отключить кеширование в среде разработки.

Моя первая версия модели User состояла из 4 полей: идентификатор, имя пользователя, пароль, роль и статус. Через некоторое время я добавил другие поля. Доктрина кэшировала только 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();

Спасибо всем, кто помогает мне с этой проблемой.

...