/ / Precisa de ajuda para entender a Doutrina um para muitos - php, sql, orm, doctrine

Precisa de ajuda para entender a Doutrina de um a muitos - php, sql, orm, doctrine

Referenciamento referência de doutrina - um para muitos unidirecional

class User
{
// ...

/**
* @ManyToMany(targetEntity="Phonenumber")
* @JoinTable(name="users_phonenumbers",
*      joinColumns={@JoinColumn(name="user_id", referencedColumnName="id")},
*      inverseJoinColumns={@JoinColumn(name="phonenumber_id", referencedColumnName="id", unique=true)}
*      )
*/
private $phonenumbers;

// ...
}

A parte que eu não entendo é unique=true. O que isso faz? O jeito que eu leio é ...

  • O usuário tem um relacionamento Muitos para Muitos com o Phonenumber
  • ele usa a tabela de junção users_phonenumbers
  • users_phonenumbers.user_id = users.id
  • users_phonenumbers.phonenumber_id = Phonenumber.id
  • e eu acho que o unique faz algo para restrições de muitos para muitos de um relacionamento de muitos para um de alguma forma. Mas como você explica isso? Também em um sentido de SQL (como é a saída)?

Respostas:

2 para resposta № 1

O mapeamento se traduz nas seguintes tabelas SQL (supondo que ambas tenham um ID substituto, chamado id):

CREATE TABLE User (id INT(10) PRIMARY KEY)
CREATE TABLE Phonenumber (id INT(10) PRIMARY KEY)
CREATE TABLE User_Phonenumber (
user_id INT(10),
phonenumber_id INT(10),
PRIMARY KEY (user_id, phonenumber_id),
UNIQUE(phonenumber_id)
);

O que isso significa em termos de seu código:

$phonenumber = new Phonenumber();
$phonenumber->setNumber("123-4567890");
$user1->addPhonenumber($phonenumber);
$user2->addPhonenumber($phonenumber);
$entityManager->flush();

Isso lançaria uma exceção de restrição exclusiva; você não pode adicionar o mesmo phonenumber a usuários diferentes, porque os phonenumbers são exclusivos (no nível do banco de dados).


0 para resposta № 2

As restrições exclusivas garantem que os dados contidos em uma coluna ou em um grupo de colunas sejam único.

Esteja ciente de que dois valores nulos NÃO são considerados iguais, portanto, você pode armazenar duas ou mais linhas duplicadas. A chave primária já é única, portanto, você não precisa usar colunas de chave primária. :)

P.