0

私はそのような関係を持っています:

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


    /**
     * @var \Doctrine\Common\Collections\ArrayCollection $tasks
     *
     * @ORM\OneToMany (targetEntity="Task", mappedBy="taskset", cascade={"ALL"})
     */
    private $tasks;

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

    /**
     * @var TaskSet $taskset
     *
     * @ORM\ManyToOne(targetEntity="TaskSet", inversedBy="tasks")
     */
    private $taskset;

生成された SQL は次のようになります。

CREATE TABLE task (
    id INT AUTO_INCREMENT NOT NULL, 
    taskset_id INT DEFAULT NULL, 
    INDEX IDX_527EDB255D67FAA4 (taskset_id), PRIMARY KEY(id)
) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ENGINE = InnoDB;

CREATE TABLE task_set (
    id INT AUTO_INCREMENT NOT NULL, 
    PRIMARY KEY(id)
) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ENGINE = InnoDB;   

ALTER TABLE task ADD CONSTRAINT FK_527EDB255D67FAA4 FOREIGN KEY (taskset_id) REFERENCES task_set (id)

今ではすべてがうまくいっているので、1 つ (テストセット) から多 (テスト) の双方向関係を取得します。

残念ながら、Doctrine2 は Task エンティティを所有側として選択するため、このコードはエンティティ間の関係を保持していません。

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

$taskset = new TaskSet();
$taskset->setName('task 1');
$taskset->setDescription('desc 1');

$task =  new Task();
$task->setName('task 1');
$task->setClassName('class name 1');
$taskset->addTask($task);

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

上記のコードからの出力は次のとおりです。

INSERT INTO `task_set` (`id`, `name`, `description`) VALUES (1, 'task 1', 'desc 1');
INSERT INTO `task` (`id`, `taskset_id`, `name`, `className`) VALUES (1, NULL, 'task 1', 'class name 1');

最後に質問:

  1. 所有側を変更する方法はありますか (もちろん関係を元に戻すことはできません)。
  2. taskset_idどのように NOT NULL としてマークしますか?
4

2 に答える 2

2
  1. クラス TaskSet で、addTask($task) 関数を編集し、最後に追加します。

    $task->setTaskset($this);

  2. カルロスがコメントで言ったように、私の最初の投稿は実際には問題に答えていません. JoinColumn 定義で nullable プロパティを使用する必要があります。

    class Task { /** * @var integer $id * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */プライベート $id;

    /**
     * @var TaskSet $taskset
     * 
     * @ORM\JoinColumn(nullable=false)
     * @ORM\ManyToOne(targetEntity="TaskSet", inversedBy="tasks")
     */
    private $taskset;
    

最初の答え:

  1. Task クラスの $taskset プロパティでValidator、この場合はNotNullバリデーターを使用します。

Symfony2 のドキュメントの例:

// src/Acme/BlogBundle/Entity/Author.php
use Symfony\Component\Validator\Constraints as Assert;

class Author
{
    /**
     * @Assert\NotNull()
     */
    protected $firstName;
}
于 2012-08-31T13:34:26.597 に答える
0

1の場合

追加

$task->setTaskSet($taskset);

所有側は変更されませんが、関係は保存されます

于 2012-08-31T13:27:25.917 に答える