初めに
Flowを使っていて、Doctrineでインデックスを貼る方法を理解していなかったので調べました。
インデックスの張り方
Doctrineには@ORM\Index
というアノテーションが用意されており、それを用いることで簡単にインデックスを張ることができます。
例
/**
* @Flow\Entity
* @ORM\Table(name="employee", indexes ={
* @ORM\Index(name="name_age_index", columns={"name", "age"})
* })
*/
class Employee
{
/**
* @ORM\Column(type="string")
* @var string
*/
protected $name;
/**
* @ORM\Column(type="integer")
* @var int
*/
protected $age;
}
SHOW CREATE TABLE
で確認したところ、KEY
name_age_index (
name,
age)
と記載されており、無事にインデックスが貼られていることが確認できました。
CREATE TABLE `employee` (
`persistence_object_identifier` varchar(40) COLLATE utf8mb4_unicode_ci NOT NULL,
`name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`age` int NOT NULL,
PRIMARY KEY (`persistence_object_identifier`),
KEY `name_age_index` (`name`,`age`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
複合ユニーク制約を貼る
続いて、複合ユニーク制約についてです。
こちらは@ORM\UniqueConstraint
アノテーションで指定できます。
例
/**
* @Flow\Entity
* @ORM\Table(name="employee", uniqueConstraints ={
* @ORM\UniqueConstraint(name="name_age_unique", columns={"name", "age"})
* })
*/
class Employee
{
/**
* @ORM\Column(type="string")
* @var string
*/
protected $name;
/**
* @ORM\Column(type="integer")
* @var int
*/
protected $age;
}
こちらも無事作成されました。
(指定した名前がうまく反映されませんが、この理由は分からず、、、)
CREATE TABLE `employee` (
`persistence_object_identifier` varchar(40) COLLATE utf8mb4_unicode_ci NOT NULL,
`name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`age` int NOT NULL,
PRIMARY KEY (`persistence_object_identifier`),
UNIQUE KEY `UNIQ_5D9F75A15E237E06A13010B2` (`name`,`age`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
終わりに
久しぶりにFlow関連の記事書きました。
Doctrine関連の理解が浅いので、もう少し学習していきたいです。
ここまで読んでいただきありがとうございました!