# Symfony Meetup Kansai \#2
by smdhogehoge
----
## Who?
- @smdhogehoge
- カルテットコミュニケーションズ
- バックエンドエンジニア
- 和歌山在住リモートワーカー
----
## インタビュー記事が出ました
https://www.remotework-labo.jp/2019/05/quartet-communications-1/

----
# 積極採用中です
特にフロントエンド!

---
## 複合ユニーク制約について
## 調べてみた
----
# 前提
複合ユニークの例
----
| 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://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://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}]"}