-1

私は、1:M 双方向関連で教義 2 を使用して所有側に固執しようとしています。何らかの奇妙な理由で (少なくとも私にとっては奇妙です)、accountIdInsert ステートメントに値を取得できず、そのために失敗します。ここで何か間違ったことをしているかどうかはわかりません。

誰が何が起こっているのか指摘できますか。

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

テーブル tAccounts キーは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 が null ではないことに肯定的です)

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
4

1 に答える 1

0

このことから、 AccountIDタイプの Object をtAccountPasswordResetに設定していないことは単純に見えます。

セッター/ゲッターと同様のことを行うtAccountPasswordResetの関数にtAccountsオブジェクトを設定または明示的に渡す必要があることを意味します。

tAccountPasswordResetクラスでこのようなことを行うことをお勧めします

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

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

そして、setResetToken関数で、tAccounts オブジェクトを次のようにセッターに設定します

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

残りの作業は Doctrine によって処理されます。

PS: 現時点では双方向に見えませんが、そうである場合は、それについて言及してください。理解できるかもしれません。

于 2013-11-01T21:42:41.793 に答える