ユーザーが複数のタスクを所有するように、1対多のリレーションを持たせます。
Userエンティティを以下のように修正します。
// ... // 追加 use Doctrine\Common\Collections\ArrayCollection; use AppBundle\Entity\Task; // ... class User extends BaseUser { // ... // 追加 /** * @var Task[] * * @ORM\OneToMany(targetEntity="Task", mappedBy="owner") * @ORM\OrderBy({"name" = "ASC"}) */ private $tasks; public function __construct() { parent::__construct(); // 追加 $this->tasks = new ArrayCollection(); } // ... }
$tasksプロパティを追加し、@ORM\OneToManyアノテーションでUserとTaskが1対nの関係であることを定義しました。また、@ORM\OrderByアノテーションで名前順にソートしています。
Taskエンティティを以下のように修正します。
// ... use AppBundle\Entity\User; // 追加 // ... class Task { // ... // 追加 /** * @var User * * @ORM\ManyToOne(targetEntity="User", inversedBy="tasks") */ private $owner; // ... }
$ownerプロパティを追加し、@ORM\ManyToOneアノテーションでTaskとUserがn対1の関係であることを定義しました。
consoleコマンドでUser.phpとTask.phpにGetter, Setterメソッドを追加します。
$ bin/console doctrine:generate:entities AppBundle
consoleコマンドでDBのスキーマーを更新します。
$ bin/console doctrine:schema:update --force
DB内のTaskデータを削除します。
$ sqlite3 var/data.db3 sqlite> delete from task;
自分が作成したタスクしか閲覧出来ないように修正します。
// ... class TaskController extends Controller { // ... public function indexAction() { // 削除 // $em = $this->getDoctrine()->getManager(); // $tasks = $em->getRepository('AppBundle:Task')->findAll(); $tasks = $this->getUser()->getTasks(); // 追加 return $this->render('task/index.html.twig', array( 'tasks' => $tasks, )); } // ... }
新規作成するタスクに所有者を追加します。
// ... class TaskController extends Controller { // ... public function newAction(Request $request) { // ... if ($form->isSubmitted() && $form->isValid()) { $em = $this->getDoctrine()->getManager(); // 追加 $task->setOwner($this->getUser()); // タスクに所有者をセット $em->persist($task); $em->flush(); return $this->redirectToRoute('task_index'); } // ... } // ... }
http://localhost:8000/task にアクセスして動作確認を行います。ログインしたユーザーが作成したタスクしか一覧に表示されないことを確認します。ログインするユーザーを切り替えながら試して下さい。