1

プロジェクトの詳細を示すフォーム情報を取得し、それをプロジェクト テーブルに追加し、割り当てられたプロジェクト テーブルにエントリを追加して、ユーザーをプロジェクトに関連付けるシステムを持っています (これのポイントは、プロジェクトごとに複数のユーザーを許可することです)。とにかく、私はこれを外部キーなしで機能させ、それらを追加するのに苦労しましたが、最終的にそれらを取得しました。

残念ながら、この追加により、assignedProjects テーブルに何かが追加されるたびに、「SQLSTATE[23000]: 整合性制約違反: 1048 列 'projectId' を null にすることはできません」というエラーが発生しました。

私の質問は、私のコードで何かを見逃していませんか?

assignedProjects に新しい行を追加するコード:

$assignedProject = new AssignedProjects();
$assignedProject->setProjectId($project->getId());
$assignedProject->setUserId($user[0]['id']);
$em = $this->getDoctrine()->getEntityManager();
$em->persist($assignedProject);
$em->flush();

assignProjects エンティティのコード: class AssignedProjects { /** * @var integer $id * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy ="AUTO") */ プライベート $id;

/**
 * @var integer $projectId
 *
 * @ORM\Column(name="projectId", type="integer")
 */
private $projectId;

/**
* @ORM\ManyToOne(targetEntity="Projects", inversedBy="assignment")
* @ORM\JoinColumn(name="projectId", referencedColumnName="id")
*/
private $project;


/**
 * @var integer $UserId
 *
 * @ORM\Column(name="userId", type="integer")
 */
private $userId;

/**
* @ORM\ManyToOne(targetEntity="Dev\UserBundle\Entity\User", inversedBy="assignment")
* @ORM\JoinColumn(name="userId", referencedColumnName="id")
*/
private $user;

(通常のゲッターとセッターが続きます)

プロジェクト テーブル エンティティは次のとおりです。

class Projects
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;

/**
* @var string $projectName
*
* @ORM\Column(name="projectName", type="string", length=255)
*/
private $projectName;


/**
* @ORM\OneToMany(targetEntity="AssignedProjects", mappedBy="project")
*/
protected $assignment;

どんな助けでも大歓迎です!

4

2 に答える 2

0

ProjectId 列と UserId 列を使用して関係を手動で管理するか (推奨されません)、教義の関係を使用しますが (推奨)、両方を実行しないでください。2 番目のオプションを選択する場合は、projectId と userId の列を含めないでください。それらは doctrine によって自動的に作成されます。したがって、AssignedProjects クラスは次のようになります。

class AssignedProjects {
/**
 * @var integer $id
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @ORM\ManyToOne(targetEntity="Projects", inversedBy="assignment")
 * @ORM\JoinColumn(name="projectId", referencedColumnName="id")
 */
private $project;


/**
 * @ORM\ManyToOne(targetEntity="Dev\UserBundle\Entity\User", inversedBy="assignment")
 * @ORM\JoinColumn(name="userId", referencedColumnName="id")
 */
private $user;

コントローラーで次のようにします。

$assignedProject = new AssignedProjects();
$assignedProject->setProject($project);
$assignedProject->setUser($user[0]);
$em = $this->getDoctrine()->getEntityManager();
$em->persist($assignedProject);
$em->flush();

IDではなく、プロジェクトとユーザーのフィールドを設定していることに注意してください

ところで、このプロジェクトの割り当てに関する余分なデータ (日付など) を保存する必要がない限り、User と Project の間に直接 ManyToMany 関係を宣言し、このクラスを廃止することができます。Doctrine は必要なテーブルを自動的に生成します。

于 2012-09-06T12:50:25.060 に答える
0

Doctrine2 では、外部キー (projectId) を宣言する必要はなく、関連付け (project) のみを宣言する必要があります。$projectIdそのため、プロパティだけでなくsetProjectIdansgetProjectIdメソッドも削除できます。$user の同じ修正...

代わりに、次のように setProject を使用します。

$assignedProject = new AssignedProjects();
$assignedProject->setProject($project);
$assignedProject->setUser($user[0]);
$em = $this->getDoctrine()->getEntityManager();
$em->persist($assignedProject);
$em->flush();

Doctrine2 のドキュメントを参照してください。きっと役に立ちます! http://docs.doctrine-project.org/projects/doctrine-orm/en/2.1/reference/association-mapping.html

于 2012-09-06T12:52:30.703 に答える