# Symfony Meetup Kansai \#2 by smdhogehoge ---- ## Who? - @smdhogehoge - カルテットコミュニケーションズ - バックエンドエンジニア - 和歌山在住リモートワーカー ---- ## インタビュー記事が出ました https://www.remotework-labo.jp/2019/05/quartet-communications-1/ ![](https://i.imgur.com/IqQLGE6.jpg) ---- # 積極採用中です 特にフロントエンド! ![](https://quartetcom.co.jp/recruit/engineer/img/intro-bg.jpg) --- ## 複合ユニーク制約について ## 調べてみた ---- # 前提 複合ユニークの例 ---- | user_id | team_id | (例) | | -------- | --------| ------- | | 1 | 1 | :man: - :dog: | 1 | 2 | :man: - :cat: | 2 | 2 | :woman: - :cat: | 1 | 1 | :man: - :dog::x: --- ## ・UniqueEntity ## ・UniqueConstraint --- ## UniqueEntity ---- ![](https://i.imgur.com/lR4IJXN.png) ---- https://symfony.com/doc/current/reference/constraints/UniqueEntity.html - SymfonyのConstraints - NotBlankとかの仲間 ---- 複数の複合ユニークもOK ```php /** * @ORM\Entity() * @UniqueEntity(fields={"name", "email"}) * @UniqueEntity(fields={"name", "team"}) */ class User ``` ---- DBに変更なし ```shell=bash % bin/console doctrine:migrations:diff In NoChangesDetected.php line 13: No changes detected in your mapping information. ``` ---- 別途Validatorが必要 - form経由の登録とか - Validator単独で使うとか ```php class UserService { private $validator; public function __construct(ValidatorInterface $validator) { $this->validator = $validator; } public function validateUser(User $user) { // ... $errors = $this->validator->validate($user); if (count($errors) > 0) { // ... } } ``` --- ## UniqueConstraint ---- ![](https://i.imgur.com/IGa7eTk.png) ---- https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/annotations-reference.html#annref_uniqueconstraint - Doctrineの機能 - SymfonyのConstraints**ではない** - DBのindexを利用 ---- 複数の複合ユニークもOK ```php /** * @ORM\Entity() * @ORM\Table( * name="user", * uniqueConstraints={ * @ORM\UniqueConstraint( * name="name_email_unique", * columns={"name", "email"} * ), * @ORM\UniqueConstraint( * name="name_team_unique", * columns={"name", "team_id"} * ), * }, * ) */ class User ``` ---- DBに変更が入る ```shell=bash % bin/console doctrine:migrations:diff ``` ```php $this->addSql( 'CREATE UNIQUE INDEX name_email_unique ON user (name, email)' ); $this->addSql( 'CREATE UNIQUE INDEX name_team_unique ON user (name, team_id)' ); ``` ---- 永続化しようとした時点で弾かれる ```php $em->persist($user1); // ... $em->persist($user2); // throw Doctrine\DBAL\Exception\UniqueConstraintViolationException $em->flush(); ``` Validator不要だが、try-catchしておきましょう --- Q.どっち使うべき?? ---- # A. 両方 ※個人の意見です ---- - 扱ってるレイヤーが違うので併用可能 - NotBlank,nullable=falseを両方書くようなもの ---- DBへの変更を考えると…。 - UniqueEntityは既存テーブルにも導入しやすい - 新しく作るならUniqueConstraintを勧めます - でもどっちも入れとこう --- # ご清聴 # ありがとう # ございました
{"metaMigratedAt":"2023-06-14T23:13:49.439Z","metaMigratedFrom":"YAML","title":"Symfony Meetup Kansai \\#2","breaks":true,"description":"Symfony Meetup Kansai \\#2","slideOptions":"{\"transition\":\"none\",\"allottedMinutes\":5,\"spotlight\":{\"enabled\":true}}","contributors":"[{\"id\":\"2f761ee7-727c-4e76-82d1-8270f4040e75\",\"add\":6521,\"del\":3492}]"}
    393 views