CakePHP3でunique制約を付けたい

データベース設計をしていてunique制約を付けたいカラムってありますよね。

例えばユーザー同士で被らせたくないメールアドレスだったり、場合によっては名前などもそうなると思います。

CakePHP3でできるunique制約の付け方を説明します。

(目次)

【自分の環境】

macOS Catalina
PHP7.4.2
CakePHP3.8
MAMP5.7
Apache2.2
MySQL5.7

マイグレーションファイルをいじればできる

マイグレーションファイルをいじります。

説明として妥当かどうか微妙ですが、ここで注意なのが、unique制約はインデックスということです。

$users_table->addIndex(['username', 'email'], ['unique' => true]);

上記はusernameカラムとemailカラムにunique制約を与えています。

上記のようにメソッド名は「addIndex()」となっています。

下記にマイグレーションファイルの例を示します。

config/Migrations/20210119102411_CreateUsers.phpファイル

public function change()
    {
        $table = $this->table('users');
        $table->addColumn('name', 'string', [
            'default' => null,
            'limit' => 255,
            'null' => false,
        ]);
        $table->addColumn('mail', 'string', [
            'default' => null,
            'limit' => 255,
            'null' => false,
        ]);
        $table->addIndex('mail', ['unique' => true]); // ここを追加。
        $table->create();
    }

この例ではmailカラムにunique制約を付けています。

第1引数にカラム名を入れます。この例では「'mail'」の部分ですね。

ここには配列でも行けます。

第2引数には一律で「['unique' => true]」と入れればOKです。

終わりに

以上となります。

今回は公式ドキュメントを主に参考にしました。

マイグレーションを書く - 3.9

unique制約は細かいところですが、のちのち効いてくる気がします。

ありがとうございました。