2

以下が機能し、行が両方のテーブルに挿入されます。

$user = new User();
$user->setId(8484);
$user->setData("user test data");

$profile = new Profile();
$profile->setBlah(8484);
$profile->setData("profile test data");

// if I leave this out it works... 
$user->setProfile($profile);

$em = $this->getDoctrine()->getEntityManager();     

$em->persist($user);
$em->flush();

しかし、省略した場合、の id が null で$user->setProfile($profile);あるため、エラーが発生します。User

An exception occurred while executing 'INSERT INTO User (id, data) VALUES (?, ?)' with params {"1":null,"2":"user test data"}

どうしてですか?

class User
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     */
    protected $id;

    /**
     * @ORM\Column(type="string", length=64)
     */
    protected $data;

    /**
     * @ORM\OneToOne(targetEntity="Profile", cascade={"persist", "remove"})
     * @ORM\JoinColumn(name="id", referencedColumnName="blah")
     */
    protected $profile;
}

class Profile
{
    /**
     * @ORM\Id
     * @ORM\Column(name="blah", type="integer")
     */
    protected $blah;

    /**
     * @ORM\Column(type="string", length=64)
     */
    protected $data;
}

プロファイルの設定方法:

/**
 * Set Profile
 *
 * @param \Test\AdminBundle\Entity\Profile $profile
 * @return User
 */
public function setProfile(\Test\AdminBundle\Entity\Profile $profile = null)
{
    $this->profile = $profile;

    return $this;
}

編集:

joinColumn の名前をランダムなものに変更すると、オブジェクトは var_dump を使用して正しく見えますが、クエリは失敗します。

/**
 * @ORM\OneToOne(targetEntity="Profile", cascade={"persist"})
 * @ORM\JoinColumn(name="random_test", referencedColumnName="blah")
 */

与えます:

An exception occurred while executing 'INSERT INTO User (id, data, random_test) VALUES (?, ?, ?)' with params {"1":8484,"2":"user test data","3":null}:
4

1 に答える 1

1

Doctrine がユーザーとプロファイルの関係を正常に作成する前に、 $profile を永続化する必要があります。

$em = $this->getDoctrine()->getEntityManager();    

$user = new User();
$user->setId(8484);
$user->setData("user test data");

$profile = new Profile();
$profile->setBlah(8484);
$profile->setData("profile test data");
$em->persist($profile);

$user->setProfile($profile); 
$em->persist($user);
$em->flush();

MySQL のコードで何をしようとしているのかを考えてみてください。

もともとあなたはこう言っていました:

プロファイルが (8484) になるユーザーを挿入します

結果は(エラー: プロファイル 8484 が存在しません)。

あなたが言いたいことは次のとおりです。

プロファイルを挿入します (8484)。プロファイルが (8484) のユーザーを挿入します。

于 2013-03-22T14:27:14.700 に答える