web-dev-qa-db-ja.com

Doctrineおよび複合一意キー

私は教義で複合ユニークキーを行いたいです。それらは私の分野です:

/**
 * @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;

一緒に組み合わされたものが複合一意キーであることをどのように示すことができますか?

87
Nikoole

質問に答えて:

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 を参照してください

191
Nikoole

useのみのORMの方が冗長であり、アノテーションの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={"nane"})
 * })
 */
class VideoSettings
16
luchaninov

これは古い質問であることは知っていますが、複合PKを作成する方法を探しているときに出くわし、何らかの更新を使用できると考えました。

必要なものが複合主キーである場合、実際は非常に簡単です。 (もちろん、一意性を保証します)Doctrineドキュメンテーションには、このURLのニースの例が含まれています: http://docs.doctrine-project.org/projects/doctrine-orm/ ja/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はプロパティ名に基づいて推測できるため、列 "name"は省略されます
  2. videoDimensionvideoBitrateは両方ともPKの一部であるため、nullable = falseを指定する必要はありません。
  3. 必要に応じて-コンポジットPKは外部キーで構成される場合があるため、いくつかのリレーショナルマッピングを自由に追加してください。
1
Stas Parshyn