【问题标题】:Doctrine 2 generates empty id on flushDoctrine 2 在刷新时生成空 id
【发布时间】:2012-06-20 02:01:06
【问题描述】:


关于stackoverflow的第一个问题,有点紧张。

所以,情况如下: 我正在将 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 等于 ''(空字符串),而不是 $login。 所以......这是我的问题:这怎么可能?是因为我在刷新之前没有填写 Member 的每个属性吗?还是没有提供有关实体之间关系的信息(一对多、多对多、多对一)?还是别的什么?我在这个问题上已经一个星期了,我想不通。

有关信息:

  • $status、$lang、$country 是外键。
  • $article 和 $filters 是多对多关系。

感谢您阅读,并且(我希望)感谢您向我解释我的错误。

【问题讨论】:

    标签: doctrine-orm flush persist string


    【解决方案1】:

    你必须像这样使用flush:

    $doctrineManager->flush();
    

    之后,您可以通过以下方式访问 id:

    $newmember->getId();
    

    【讨论】:

    • 我尝试了您的解决方案,但没有任何改变。 id 仍然是空的(int 0 和 var_dump($newMember->getLogin());)。我认为问题是基于持久性,而不是刷新,因为当 Doctrine 在我的数据库中添加该行时,登录为空。
    • 请像这样更改您的身份注释(您必须更改列名等): /** * @ var integer $id * @ Column(name="id", type="integer", nullable =false) * @Id *@ GeneratedValue(strategy="IDENTITY") */ private $id;
    • 我按照你说的做了,并请求别人为我生成实体,现在工作正常!非常感谢你们俩。
    【解决方案2】:

    事实上$idarticles 和$idfilters 是ManyToMany 关系,我没有具体说明。在构造对象时,有可能 Doctrine 2 无法根据映射构造对象。

    所以构造函数看起来像这样:

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

    每个 ManyToMany 都必须获取它们的 ArrayCollections 才能工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-15
      • 2017-05-04
      • 2011-12-17
      • 1970-01-01
      • 2015-02-02
      相关资源
      最近更新 更多