複合ユニーク制約について調べてみた Symfony Meetup Kansai #2 / Symfony Unique Constraints For Multiple Columns

複合ユニーク制約について調べてみた Symfony Meetup Kansai #2 / Symfony Unique Constraints For Multiple Columns

Dccc0413ed0f46b805bc628b3149021f?s=128

shimokei53

August 07, 2019
Tweet

Transcript

  1. Symfony Meetup Symfony Meetup Kansai #2 Kansai #2 by smdhogehoge

    by smdhogehoge 1 1 . . 1 1
  2. Who? Who? @smdhogehoge @smdhogehoge カルテットコミュニケーションズ カルテットコミュニケーションズ バックエンドエンジニア バックエンドエンジニア 和歌⼭在住リモートワーカー 和歌⼭在住リモートワーカー

    1 1 . . 2 2
  3. インタビュー記事が出ました インタビュー記事が出ました https://www.remotework-labo.jp/2019/05/quartet- https://www.remotework-labo.jp/2019/05/quartet- communications-1/ communications-1/

  4. 積極採⽤中です 積極採⽤中です 特にフロントエンド! 特にフロントエンド! 1 1 . . 4 4

  5. 複合ユニーク制約について 複合ユニーク制約について 調べてみた 調べてみた 2 2 . . 1 1

  6. 前提 前提 複合ユニークの例 複合ユニークの例 2 2 . . 2 2

  7. user_id user_id team_id team_id (例) (例) 1 1 1 1

    - - 1 1 2 2 - - 2 2 2 2 - - 1 1 1 1 - - 2 2 . . 3 3
  8. ・UniqueEntity ・UniqueEntity ・UniqueConstraint ・UniqueConstraint 3 3

  9. UniqueEntity UniqueEntity 4 4 . . 1 1

  10. 4 4 . . 2 2

  11. SymfonyのConstraints SymfonyのConstraints NotBlankとかの仲間 NotBlankとかの仲間 https://symfony.com/doc/current/reference/constraint https://symfony.com/doc/current/reference/constraint 4 4 . .

    3 3
  12. 複数の複合ユニークもOK 複数の複合ユニークもOK /** /** * * @ORM @ORM\Entity() \Entity() *

    * @UniqueEntity @UniqueEntity(fields={"name", "email"}) (fields={"name", "email"}) * * @UniqueEntity @UniqueEntity(fields={"name", "team"}) (fields={"name", "team"}) */ */ class class User User 4 4 . . 4 4
  13. DBに変更なし DBに変更なし % bin/ % bin/console console doctrine:migrations:diff doctrine:migrations:diff In

    NoChangesDetected.php line In NoChangesDetected.php line 13 13: : No changes detected No changes detected in in your mapping information. your mapping information. 4 4 . . 5 5
  14. 別途Validatorが必要 別途Validatorが必要 form経由の登録とか form経由の登録とか Validator単独で使うとか Validator単独で使うとか class class UserService UserService

    { { private private $validator; $validator; public public function function __construct __construct(ValidatorInterface $validator (ValidatorInterface $validator { { $this $this->validator = $validator; ->validator = $validator; } } public public function function validateUser validateUser(User $user) (User $user) { { // ... // ... $errors = $errors = $this $this->validator->validate($user); ->validator->validate($user); if if (count($errors) > (count($errors) > 0 0) { ) { 4 4 . . 6 6
  15. UniqueConstraint UniqueConstraint 5 5 . . 1 1

  16. 5 5 . . 2 2

  17. Doctrineの機能 Doctrineの機能 SymfonyのConstraints SymfonyのConstraintsではない ではない DBのindexを利⽤ DBのindexを利⽤ https://www.doctrine-project.org/projects/doctrine- https://www.doctrine-project.org/projects/doctrine- orm/en/2.6/reference/annotations-

    orm/en/2.6/reference/annotations- reference.html#annref_uniqueconstraint reference.html#annref_uniqueconstraint 5 5 . . 3 3
  18. 複数の複合ユニークもOK 複数の複合ユニークもOK /** /** * * @ORM @ORM\Entity() \Entity() *

    * @ORM @ORM\Table( \Table( * name="user", * name="user", * uniqueConstraints={ * uniqueConstraints={ * * @ORM @ORM\UniqueConstraint( \UniqueConstraint( * name="name_email_unique", * name="name_email_unique", * columns={"name", "email"} * columns={"name", "email"} * ), * ), * * @ORM @ORM\UniqueConstraint( \UniqueConstraint( * name="name_team_unique", * name="name_team_unique", * columns={"name", "team_id"} * columns={"name", "team_id"} * ), * ), * }, * }, * ) * ) 5 5 . . 4 4
  19. DBに変更が⼊る DBに変更が⼊る % % bin/console doctrine:migrations:diff bin/console doctrine:migrations:diff $this $this->addSql(

    ->addSql( 'CREATE UNIQUE INDEX name_email_unique ON user (name, email 'CREATE UNIQUE INDEX name_email_unique ON user (name, email ); ); $this $this->addSql( ->addSql( 'CREATE UNIQUE INDEX name_team_unique ON user (name, team_i 'CREATE UNIQUE INDEX name_team_unique ON user (name, team_i ); ); 5 5 . . 5 5
  20. 永続化しようとした時点で弾かれる 永続化しようとした時点で弾かれる Validator不要だが、try-catchしておきましょう Validator不要だが、try-catchしておきましょう $em->persist($user1); $em->persist($user1); // ... // ...

    $em->persist($user2); $em->persist($user2); // throw Doctrine\DBAL\Exception\UniqueConstraintViolationExc // throw Doctrine\DBAL\Exception\UniqueConstraintViolationExc $em->flush(); $em->flush(); 5 5 . . 6 6
  21. Q.どっち使うべき?? Q.どっち使うべき?? 6 6 . . 1 1

  22. A. 両⽅ A. 両⽅ ※ 個⼈の意⾒です ※ 個⼈の意⾒です 6 6

    . . 2 2
  23. 扱ってるレイヤーが違うので併⽤可能 扱ってるレイヤーが違うので併⽤可能 NotBlank,nullable=falseを両⽅書くようなもの NotBlank,nullable=falseを両⽅書くようなもの 6 6 . . 3 3

  24. DBへの変更を考えると…。 DBへの変更を考えると…。 UniqueEntityは既存テーブルにも導⼊しやすい UniqueEntityは既存テーブルにも導⼊しやすい 新しく作るならUniqueConstraintを勧めます 新しく作るならUniqueConstraintを勧めます でもどっちも⼊れとこう でもどっちも⼊れとこう 6 6

    . . 4 4
  25. ご清聴 ご清聴 ありがとう ありがとう ございました ございました 7 7