Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Relacionamento OneToOne

Bom dia. Vi explicando na documentação que "O lado proprietário de uma associação OneToOne é a entidade com a tabela que contém a chave estrangeira" e me deu dúvida pois não é com relacionamento ManyToOne que se guarda a chave estrangeira de outra tabela (igual Telefone e Aluno)? Tem um exemplo dentro do nosso curso de relacionamento OneToOne para ficar mais claro?

5 respostas

Karolina, sua dúvida não ficou muito clara pra mim. Mas segue um exemplo de OneToOne :

#[Entity]
class Customer
{
     #[OneToOne(targetEntity: Cart::class, mappedBy: "customer")]
    private Cart $cart;

    // ...
}

#[Entity]
class Cart
{
    #[OneToOne(targetEntity: Customer::class, inversedBy: "cart")]
    #[JoinColumn(name: "customer_id", referencedColumnName: "id")]
    private Customer $customer;
}

Isso vai gerar o seguinte schema:

CREATE TABLE Cart (
    id INT AUTO_INCREMENT NOT NULL,
    customer_id INT DEFAULT NULL,
    UNIQUE INDEX UNIQ_BA388B79395C3F3 (customer_id),
    PRIMARY KEY(id)
) ENGINE = InnoDB;
CREATE TABLE Customer (
    id INT AUTO_INCREMENT NOT NULL,
    PRIMARY KEY(id)
) ENGINE = InnoDB;
ALTER TABLE Cart ADD FOREIGN KEY (customer_id) REFERENCES Customer(id);

Obrigada pelo exemplo. A minha dúvida é que no relacionamento ManyToOne, a chave estrangeira fica do lado "Muitos" ou N certo? No relacionamento OneToOne a chave estrangeira é a gente que escolhe o lado? Por exemplo, você colocou a chave estranheira customerId em Cart. Porquê? E o que esse JoinColumn?

No relacionamento OneToOne a chave estrangeira é a gente que escolhe o lado?

Sim. Assim como em ManyToMany

E o que esse JoinColumn?

Ele só configura os detalhes da coluna da chave estrangeira. É opcional.

Na verdade o ManyToMany não fica a chave estrangeira de um lado ou de outro, mas as chaves das duas tabelas ficam numa nova tabela intermediária né?

solução!

Sim, mas o mappedBy ou inversedBy nós que escolhemos onde vamos colocar no relacionamento. Tanto faz. :-D

Eu estava me referindo somente ao ORM, não ao schema gerado para o banco. :)