2012-06-20 2 views
0


Первый вопрос о переполнении стека, немного нервный.

Doctrine 2 генерирует пустой идентификатор на флеше

Итак, вот что: Я использую Doctrine 2 для сайта. Я правильно установил его без груши, используя хорошие библиотеки и хорошие пути в своем приложении. Я создал свою БД, прежде чем начинать код, поэтому я создал сопоставление (xml & yml, на всякий случай) с методом обратной инженерии (доктринер экспортером). Сгенерированные сопоставления прекрасны, тогда я сам написал файлы сущностей (консоль не работала).

/** @Entity */ 
class Member { 

/** @Id @Column(type="string", nullable=false) */ 
private $login; 
/** @Column(type="string", nullable=false) */ 
private $password; 
/** @Column(type="string") */ 
private $mail; 
/** */ 
private $dateregister; 
/** */ 
private $datelastconnexion; 
/** @Column(type="string") */ 
private $description; 
/** */ 
private $birthday; 
/** @Column(type="string") */ 
private $website; 
/** @Column(type="boolean") */ 
private $activated; 
/** @Column(type="integer") */ 
private $idstatus; 
/** @Column(type="integer") */ 
private $idcountry; 
/** @Column(type="integer") */ 
private $idlang; 

/** @Column(type="integer") */ 
private $idarticle; 
/** @Column(type="integer") */ 
private $idfilters; 

public function __construct($login) { 
    $this->login = $login; 
    $this->activated = false; 
} 


public function getLogin() {return $this->login;} 
public function getPassword() {return $this->password;} 
public function getMail() {return $this->mail;} 
public function getDateregister() {return $this->dateregister->format('Y/m/d');} 
public function getDatelastconnexion() {if ($this->datelastconnexion == null) return 'Never logged'; 
    else return $this->datelastconnexion->format('Y/m/d H:i');} 
public function getDescription() {return $this->description;} 
public function getBirthday() {return $this->birthday->format('Y/m/d');} 
public function getWebsite() {return $this->website;} 
public function getActivated() {return $this->activated;} 
public function getStatus() {return $this->idstatus;} 
public function getCountry() {return $this->idcountry;} 
public function getLang() {return $this->idlang;} 
public function getArticles() {return $this->idarticle->toArray();} 
public function getFilters() {return $this->idfilters->toArray();} 

public function setLogin($newLogin) {$this->login = $newLogin;} 
public function setPassword($newPassword) {$this->password = sha1($newPassword);} 
public function setMail($newMail) {$this->mail = $newMail;} 
public function setDateregister($newDate) {$this->dateregister = $newDate;} 
public function setDatelastconnexion($newDate) {$this->datelastconnexion = $newDate;} 
public function setDescription($newDescription) {$this->description = $newDescription;} 
public function setBirthday($newDate) {$this->birthday = $newDate;} 
public function setWebsite($newWebsite) {$this->website = $newWebsite;} 
public function setActivated($activate) {$this->activated = $activate;} 
public function setStatus($newStatus) {$this->idstatus = $newStatus;} 
public function setCountry($newCountry) {$this->idcountry = $newCountry;} 
public function setLang($newLang) {$this->idlang = $newLang;} 
public function setArticles($newArticles) {$this->idarticle = $newArticles;} 
public function setFilters($newFilters) {$this->idfilters = $newFilters;} 

} 

Теперь я пытался вставить что-то в базу данных, но я заблокирован с небольшой проблемой: Когда член пытается зарегистрировать, он заполняет некоторую информацию (логины, пароли и т.д.). Я делаю все тесты, чтобы убедиться, что информация правильная, и если они есть, я создаю новый объект-член, который я заполняю каждой заданной информацией и автоматически генерирую, затем вызываю persist() на объект, а затем flush().

$newMember = new Member($login); 
$newMember -> setPassword($passwd); 
$newMember -> setMail($mail); 
$newMember -> setDateregister($currentDate); 
$newMember -> setDescription($description); 
$newMember -> setBirthday($newBirthday); 
$newMember -> setStatus($status[0]); // existing object 
$newMember -> setCountry($country[0]); // existing object 
$newMember -> setLang($lang[0]); // existing object 
$doctrineManager->persist($newMember); 
$doctrineManager->flush($newMember); 

я получил некоторое удивление, глядя в базу данных, видя, заполненного ID равно «» (пустая строка), а не $ логин. Итак ... это мой вопрос: как это возможно? Это потому, что я не заполнял каждое свойство члена до промывки? или не давали информации об отношениях между субъектами (один-ко-многим, многим-ко-многим, многим-к-одному)? или что-нибудь еще? Я на эту проблему в течение недели, я не мог понять.

Для информации:

  • $ статус, $ Ланг, $ страна внешние ключи.
  • $ article и $ filters - отношения много-ко-многим.

Спасибо за чтение и (надеюсь) спасибо за разъяснение мне моих ошибок.

ответ

0

Вы должны использовать флеш, как это:

$doctrineManager->flush(); 

после этого вы можете получить доступ к идентификатору с:

$newmember->getId(); 
+0

Я попробовал ваше решение, но ничего не изменил. Идентификатор по-прежнему пуст (int 0 с параметром 'var_dump ($ newMember-> getLogin());'). Я думаю, что проблема основана на сохранении, а не на флеше, потому что, когда Doctrine добавляет строку в мою БД, логин пуст. – Sylordis

+0

Пожалуйста, измените свой личный комментарий, как это (вы должны изменить имя столбца и т. Д.):/** * @ var integer $ id * @ Column (name = "id", type = "integer", nullable = false) * @ Id * @ GeneratedValue (strategy = "IDENTITY") */ private $ id; – ActuallyMAB

+0

Я сделал то, что вы мне сказали, и попросил кого-то создать сущности для меня, теперь он работает нормально! Большое вам спасибо обоим вам. – Sylordis

0

Тем фактом, составляет $ idarticles и $ idfilters были ManyToMany отношения, которые я не делал указано. При построении объекта возможно, что Доктрина 2 не смогла построить объект в соответствии с отображением.

Так функция конструкция выглядит следующим образом:

public function __construct() 
{ 
    $this->idfilters = new \Doctrine\Common\Collections\ArrayCollection(); 
    $this->idarticle = new \Doctrine\Common\Collections\ArrayCollection(); 
    $this->activated = false; 
} 

И каждый ManyToMany должны получить свои ArrayCollections, чтобы работать.

 Смежные вопросы

  • Нет связанных вопросов^_^