Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

・UniqueEntity ・UniqueEntity ・UniqueConstraint ・UniqueConstraint 3 3

Slide 9

Slide 9 text

UniqueEntity UniqueEntity 4 4 . . 1 1

Slide 10

Slide 10 text

4 4 . . 2 2

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

複数の複合ユニークも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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

別途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

Slide 15

Slide 15 text

UniqueConstraint UniqueConstraint 5 5 . . 1 1

Slide 16

Slide 16 text

5 5 . . 2 2

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

複数の複合ユニークも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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

永続化しようとした時点で弾かれる 永続化しようとした時点で弾かれる 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

Slide 21

Slide 21 text

Q.どっち使うべき?? Q.どっち使うべき?? 6 6 . . 1 1

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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