シムノート

PHPフレームワークSymfonyの学習帳

ユーザ用ツール

サイト用ツール


サイドバー

メニュー



このエントリーをはてなブックマークに追加

blog:2015-12-22:symfony入門_todoリストチュートリアル_doctrine_リレーション

Symfony3入門 TODOリストチュートリアル : (5) Doctrine リレーション

ユーザーが複数のタスクを所有するように、1対多のリレーションを持たせます。

エンティティの修正

OneToMany

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アノテーションで名前順にソートしています。

ManyToOne

Taskエンティティを以下のように修正します。

// ...

use AppBundle\Entity\User; // 追加

// ...
class Task
{
    // ...

    // 追加
    /**
     * @var User
     *
     * @ORM\ManyToOne(targetEntity="User", inversedBy="tasks")
     */
    private $owner;

    // ...
}

$ownerプロパティを追加し、@ORM\ManyToOneアノテーションでTaskとUserがn対1の関係であることを定義しました。

Getter, Setterの生成

consoleコマンドでUser.phpとTask.phpにGetter, Setterメソッドを追加します。

$ bin/console doctrine:generate:entities AppBundle

DBの修正

consoleコマンドでDBのスキーマーを更新します。

$ bin/console doctrine:schema:update --force

DB内のTaskデータを削除します。

$ sqlite3 var/data.db3

sqlite> delete from task;

コントローラの修正

indexAction

自分が作成したタスクしか閲覧出来ないように修正します。

// ...
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,
        ));
    }
    // ...
}

newAction

新規作成するタスクに所有者を追加します。

// ...
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 にアクセスして動作確認を行います。ログインしたユーザーが作成したタスクしか一覧に表示されないことを確認します。ログインするユーザーを切り替えながら試して下さい。


Comments



227 +13 = ?
blog/2015-12-22/symfony入門_todoリストチュートリアル_doctrine_リレーション.txt · 最終更新: 2015/12/22 18:50 by tsubo