0

必要に応じて機能する多くの関連付けマッピングがありますが、エンティティを双方向または関連付けで@ManyToMany永続化しようとすると、Doctrine は次のエラーをスローします。@OneToOne@ManyToOne

Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'uid' cannot be null'

エンティティ/EntityBase.php

namespace Entities;

class EntityBase{

    /** @Column(type="integer", columnDefinition="INT AUTO_INCREMENT NOT NULL") */
    protected $id;

    /** @Column(type="datetime") */
    protected $created;

    /** @Column(type="datetime") */
    protected $updated;
}

エンティティ/User.php

namespace Entities;

/**
 * @Entity(repositoryClass="Repositories\UserRepository")
 * @Table(name="users", indexes={@Index(name="id", columns={"id"})})
 */
class User extends EntityBase{

    /** @Id @Column(type="string") */
    protected $uid;

    /** @Column(type="string", nullable=true) */
    protected $first_name;

    /** @Column(type="string", nullable=true) */
    protected $middle_name;

    /** @Column(type="string", nullable=true) */
    protected $last_name;

    /** @OneToOne(targetEntity="Entities\Interest", mappedBy="user") **/
    private $interest;
}

エンティティ/Interest.php

namespace Entities;

/**
 * @Entity(repositoryClass="Repositories\InterestRepository")
 * @Table(name="interests", indexes={@Index(name="id", columns={"id"})})
 */
class Interest extends EntityBase{

    /** @Id @Column(type="string") */
    protected $uid;

    /** @Column(type="string", nullable=true) */
    protected $interests;

    /**
     * @OneToOne(targetEntity="Entities\User", inversedBy="interest")
     * @JoinColumn(name="uid", referencedColumnName="uid")
     **/
    private $user;

    public function setUserId($uid){
        $this->uid = $uid;
    }

    public function setInterests($interests){
        $this->interests = $interests;
    }
}

上記の関連付けは、ユーザーが 1 つの関心を持つことができ、関心が 1 人のユーザーに属することを示す必要があります。uid永続化されているidデータセットは、すべてのユーザーが一意のuid. 'uid' cannot be nullデータセットをダンプしたので、なぜ表示されるのかわかりませんuidが、間違いなく文字列として渡されています。

これが私の相互作用コードです:

//Example
$data = array('uid' => '10298564', 'interests' => 'Creative Art');

if(!$interest = $entityManager->getRepository('Entities\Interest')->findOneBy(array('uid' => $data['uid']))){
    $interest = new Entities\Interest();
}

$interest->setUserId($data['uid']);
$interest->setInterest($user['interests']);

$entityManager->persist($interest);
$entityManager->flush();

@OneToOneUser と Interest を関連付けてこれを実行すると、Integrity Constraint violation永続化時にエラーが発生します。ただし、関連付けを削除すると、エンティティは正しく保持され、データベースが更新されます。

何か不足していますか?

4

1 に答える 1