学说2,1:M双向持久不能正常工作

时间:2013-11-01 19:15:57

标签: php doctrine-orm zend-framework2 associations persist

我试图在1:M双向关联中使用原则2坚持到Owning方面。由于一些奇怪的原因(至少对我而言是奇怪的),我没有将accountId值输入到Insert语句中,并且由于这个原因它失败了。我不确定我在这里做错了什么。

任何人都可以指出发生了什么。

**使用Zend Framework 2 + ubuntu + mysql。

表t帐户密钥为accountId,此表通过外键accountId连接到tAccountPasswordReset

(拥有方)。

class tAccountPasswordReset {
/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(type="integer")
*/
protected $Id;
/** @ORM\Column(type="integer") */
protected $accountId;
.......
.......
/** 
* @ORM\ManyToOne(targetEntity="tAccounts", inversedBy="accountpasswordreset")
* @ORM\JoinColumn(name="accountId", referencedColumnName="accountId")
**/
private $accounts;

(反面)

class tAccounts {
/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(type="integer")
*/
protected $accountId;
/** @ORM\Column(type="string") */

....    ....

/** @ORM\OneToMany(targetEntity="tAccountPasswordReset", mappedBy="accounts") */
private $accountpasswordreset;

public function __construct() {
    /** Get the dependence rowset from the tAccountPasswordReset */
    $this->accountpasswordreset = new ArrayCollection();
}

在tAccountPaswordReset中插入一行 (我对accountId不为空持肯定态度)

private function setResetToken($accountid) {
    try {
        $token = uniqid().uniqid(); /** Generate a unique token */
        $newReset = new \Entity\Tables\tAccountPasswordReset();
        $newReset->accountId = $accountid;
        $newReset->resetToken = $token;
        $this->entityManager->persist($newReset);
        $this->entityManager->flush();
        return $token;
    } catch (Exception $e) {
        throw $e;
    }
}

(结果)

An exception occurred while executing '
INSERT INTO tAccountPasswordReset (accountId, resetToken, createTime, expTime) 
VALUES (?, ?, ?, ?)' with params [null, "5273f94bd75f15273f94bd7641", "2013-11-01 14:56:11", "2013-11-02 14:56:11"]: SQLSTATE[23000]: 
Integrity constraint violation: 1048 Column 'accountId' cannot be null

1 个答案:

答案 0 :(得分:0)

从这看起来很简单,您没有将 AccountID 类型的对象设置为 tAccountPasswordReset

表示您需要将 tAccounts 对象设置或显式传递给 tAccountPasswordReset 的函数,该函数执行类似于setter / getter的操作。

我建议您在 tAccountPasswordReset 类中执行类似的操作

public function getTAccount(){
 return $this->AccountID;
 } 

 public function setTAccount((complete path to this class)/tAccounts $tAccounts){
 $this->AccountID = $tAccounts;
}

然后在你的 setResetToken 函数中,将tAccounts对象设置为这样的setter

  $newReset->setTAccount(pass tAccounts object here);// if you dont know how to set object here comment below

其余的工作将由Doctrine处理。

PS:目前它对我来说看起来并不像双向,但如果确实如此,那么我可以理解它。