Doutrina e chaves únicas compostas

96

Eu quero fazer uma chave única composta na doutrina. Esses são meus campos:

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

Como posso mostrar a doutrina de que aqueles combinados são uma chave única composta?

Nikoole
fonte

Respostas:

216

Responda à pergunta:

use Doctrine\ORM\Mapping\UniqueConstraint;

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

Veja @UniqueConstraint

Nikoole
fonte
3
Obrigado pela informação ~ Como observação, se você resolveu sua própria pergunta, embora não possa aceitá-la imediatamente, geralmente é uma boa forma de aceitar sua própria resposta; portanto, se as pessoas estiverem pesquisando, isso mostra que há uma resposta aceitável.
Rixius
2
É possível fazer isso com -ToOneassociações (chaves estrangeiras)?
Dimitry K,
5
Eu sei que este é um post antigo, mas @Dimitry K é possível. Você só precisa usar o nome da coluna como em @ORM \ JoinColumn (name = "join_table_id", referencedColumnName = "id", nullable = false). Aqui está 'join_table_id'.
herr
Observe que você deve fornecer nomes de coluna , não nomes de campo. Então você tem que converter camelCase em snake_case e acrescentar _idpara associações, porque é assim que Doctrine gera nomes de coluna.
gronostaj
nomes são gerados automaticamente @Table(uniqueConstraints={@UniqueConstraint(columns={"case_id", "duration"})})e nada mais importa
Vasilii Suricov
18

Acho que é mais prolixo useapenas para ORM e prefixo ORMnas anotações. Observe também que você pode quebrar a anotação em várias linhas para torná-la mais legível, especialmente se você tiver vários itens a serem mencionados (índice no exemplo abaixo).

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
Luchaninov
fonte
2

Eu sei que esta é uma pergunta antiga, mas me deparei com ela enquanto procurava uma maneira de criar PK composta e pensei que poderia usar alguma atualização.

Na verdade, as coisas são muito mais simples se você precisar de uma chave primária composta. (O que, é claro, garante exclusividade) A documentação do Doctrine contém alguns bons exemplos por este url: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/composite-primary-keys.html

Portanto, o exemplo original poderia ser semelhante a este:

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

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

Algumas notas aqui:

  1. A coluna "nome" é omitida uma vez que o Doctrine é capaz de adivinhá-la com base no nome da propriedade
  2. Uma vez que videoDimensione videoBitratesão partes do PK - não há necessidade de especificarnullable = false
  3. Se necessário - o PK composto pode ser composto de chaves estrangeiras, então sinta-se à vontade para adicionar alguns mapeamentos relacionais
Stas Parshyn
fonte
O que você fez foi uma chave primária composta. Claro que será único, mas é uma chave primária ...;)
Preciel
Bem, sim, acho que mencionei isso em minha resposta :) Na verdade, o termo "índice exclusivo" seria mais apropriado no caso de OP se ele não tivesse a intenção de criar PK (é o que a resposta aceita faz). Mas como a pergunta contém um termo estranho "chave única composta" - não vejo por que não podemos supor que seja uma chave primária composta - pelo menos é isso que estou procurando quando me deparei com essa pergunta. Felicidades!
Stas Parshyn