Doctrineと複合固有キー


96

教義で複合固有キーを作成したいと思います。それらは私の分野です:

/**
 * @var string $videoDimension
 *
 * @Column(name="video_dimension", type="string", nullable=false)
 */
private $videoDimension;

/**
 * @var string $videoBitrate
 *
 * @Column(name="video_bitrate", type="string", nullable=false)
 */
private $videoBitrate;

一緒に結合されたものが複合固有キーであることをどのようにして教えますか?

回答:


216

質問に答えて:

use Doctrine\ORM\Mapping\UniqueConstraint;

/**
 * Common\Model\Entity\VideoSettings
 *
 * @Table(name="video_settings", 
 *    uniqueConstraints={
 *        @UniqueConstraint(name="video_unique", 
 *            columns={"video_dimension", "video_bitrate"})
 *    }
 * )
 * @Entity
 */

@UniqueConstraintを参照してください


3
情報をありがとう〜注意として、あなたがあなた自身の質問を解決した場合、すぐに受け入れることはできませんが、あなた自身の答えを受け入れることは、一般的に良い形です。
Rixius

2
-ToOneアソシエーション(外部​​キー)でそれを行うことは可能ですか?
Dimitry K

5
私はこれが古い投稿であることを知っていますが、@ Dimitry Kは可能です。@ORM \ JoinColumn(name = "join_table_id"、referencesColumnName = "id"、nullable = false)のように列名を使用する必要があるだけです。これが 'join_table_id'です。
2015年

フィールド名ではなく、名を指定する必要があることに注意してください。したがって_id、Doctrineが列名を生成する方法であるので、キャメルケースをsnake_caseに変換し、関連付けのために追加する必要があります。
gronostaj 2018年

名前は自動生成され@Table(uniqueConstraints={@UniqueConstraint(columns={"case_id", "duration"})})、それ以外は重要ではありません
Vasilii Suricov

18

useORMだけのほうが冗長ORMで、注釈の前に付けます。特に、言及する項目が複数ある場合は、注釈を複数行に分割して読みやすくすることもできます(以下の例のインデックス)。

use Doctrine\ORM\Mapping as ORM;

/**
 * VideoSettings
 *
 * @ORM\Cache(usage="NONSTRICT_READ_WRITE")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\VideoSettingsRepository")
 * @ORM\Table(name="emails", uniqueConstraints={
 *      @ORM\UniqueConstraint(name="dimension_bitrate", columns={"video_dimension", "video_bitrate"})
 * }, indexes={
 *      @ORM\Index(name="name", columns={"name"})
 * })
 */
class VideoSettings

2

私はこれが古い質問であることを知っていますが、複合PKを作成する方法を探しているときに私はそれに遭遇し、更新を使用できると考えました。

必要なものが複合主キーである場合、実際にははるかに簡単です。(もちろん、一意性を保証します)Doctrineのドキュメントには、次のURLによるいくつかの素晴らしい例が含まれています:http : //docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/composite-primary-keys.html

したがって、元の例は次のようになります。

/**
 * @var string $videoDimension
 *
 * @ORM\Id @ORM\Column(type="string")
 */
private $videoDimension;

/**
 * @var string $videoBitrate
 *
 * @ORM\Id @ORM\Column(type="string")
 */
private $videoBitrate;

ここにいくつかのメモ:

  1. Doctrineはプロパティ名に基づいて推測できるため、列「名前」は省略されています
  2. 以来videoDimensionvideoBitratePKの両方の部分がある-を指定する必要はありませんnullable = false
  3. 必要に応じて-複合PKは外部キーで構成されている可能性があるため、リレーショナルマッピングを追加してください。

あなたがしたことは複合主キーです。確かに一意ですが、それは主キーです...;)
Preciel

ええ、私は私の回答で言及したと思います:)実際、「一意のインデックス」という用語は、OPの場合、PKを作成するつもりがなかった場合に適しています(それが、受け入れられた回答です)。しかし、質問には「複合一意キー」という奇妙な用語が含まれているため、複合主キーであると想定できない理由がわかりません。少なくとも、この質問に出くわしたときに探していたのはそれです。乾杯!
Stas Parshyn、2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.