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

Dica: Erro: Column name `id` referenced for relation from Alura\Doctrine\Entities\Phone towards Alura\Doctrine\Entities\Student does not exist.

Escolher um nome diferente de $id para o atributo de id de uma entidade ocasiona o erro, citado no título acima, ao executar o migrations:diff.

Tanto na versão 2.3 quanto na versão 3.0.1, o Doctrine Migrations só reconhece o atributo $id das entidades se o nome do atributo for $id, mesmo possuindo annotation em cima deste atributo.

No meu caso, eu quis escrever os nomes dos atributos em inglês e decidi que o nome do atributo seria $studentId, ao invés de apenas $id, o que ocasionou o erro. Mudar para $id soluciona o problema.

7 respostas

Murilo, pode postar seu código com o mapeamento completo? Isso não deveria gerar erro não.

Vinicius, boa tarde! Desculpa a demora, tive que dar uma pausa no curso para atender outras demandas.

Segue o mapeamento das entidades abaixo.

Código da entidade Student.php

<?php

namespace Muriloloffi\Doctrine\Entities;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;

/**
 * @Entity
 */
class Student
{
    /**
     * @Id
     * @GeneratedValue
     * @Column(type="integer")
     */
    private int $id;

    /**
     * @Column(type="string")
     */
    private string $studentName;

    /**
     * @OneToMany(targetEntity="Phone", mappedBy="Student")
     */
    private Collection $phones;

Entidade Phone.php

<?php

namespace Muriloloffi\Doctrine\Entities;

/**
 * @Entity
 */
class Phone
{
    /**
     * @Id
     * @GeneratedValue
     * @Column(type="integer")
     */
    private int $id;

    /**
     * @Column(type="string")
     */
    private string $phoneNumber;

    /**
     * @ManyToOne(targetEntity="Student")
     */
    private $student;

E ao simplesmente mudar o nome do atributo de $id para algo diferente gera um erro?

Isso não deveria acontecer...

Isso mesmo. Mudar o atribute de $id para $studentId ou qualquer outra coisa gera este erro aqui, com a segunda linha dentro daquela caixa vermelha.

In SchemaTool.php line 655:

  Column name `id` referenced for relation from Muriloloffi\Doctrine\Entities\Phone towards Muriloloffi\Doctrine\Entities\St  
  udent does not exist.                                                                                                       


migrations:diff [--configuration CONFIGURATION] [--db-configuration DB-CONFIGURATION] [--namespace NAMESPACE] [--filter-expression FILTER-EXPRESSION] [--formatted] [--line-length LINE-LENGTH] [--check-database-platform [CHECK-DATABASE-PLATFORM]] [--allow-empty-diff]
solução!

Sendo muito sincero, eu não sabia dessa, Murilo.

Pra resolver basta informar o @JoinColumn no relacionamento. Exemplo:

/**
 * @Entity
 */
class Aluno
{
    /**
     * @Id
     * @GeneratedValue
     * @Column(type="integer", name="id_aluno")
     */
    private $idAluno;
    ...
}

/**
 * @Entity
 */
class Telefone
{
    ...

    /**
     * @ManyToOne(targetEntity="Aluno", inversedBy="telefones")
     * @JoinColumn(name="id_do_aluno_nessa_tabela", referencedColumnName="id_aluno")
     */
    private $aluno;

Me diz se entendeu. :-)

Opa, vamos ver, acho que entendi! :)

Na anotação @JoinColumn(name="id_do_aluno_nessa_tabela" ...) da entidade Telefone, este campo name é como se fosse o nome da chave estrangeira que Telefone vai possuir para Aluno, né?

Em SQL isto se traduz para

ALTER TABLE Telefone 
    ADD FOREIGN KEY (id_do_aluno_nessa_tabela) 
    REFERENCES Aluno(idAluno);

É isto?

Exatamente, Murilo. :-)

Nos outros cursos de Doctrine a gente fala um pouquinho de JoinColumns

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software