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

Coluna nome-DOCTRINE

Olá Alura,

O link está aqui: git@github.com:tiagobrandao03/2612-doctrine.git

Estou tendo problema ao adicionar uma coluna na entidade Course. Não consigo inserir dados, porque consta que eu não declarei a coluna $nome. Aqui está o erro:

C:\xampp\htdocs\2612-doctrine>php bin/insert-course.php "Doctrine"
PHP Fatal error:  Uncaught PDOException: SQLSTATE[HY000]: General error: 1 table Course has no column named nome in C:\xampp\htdocs\2612-doctrine\vendor\doctrine\dbal\src\Driver\PDO\Connection.php:59
Stack trace:
#0 C:\xampp\htdocs\2612-doctrine\vendor\doctrine\dbal\src\Driver\PDO\Connection.php(59): PDO->prepare('INSERT INTO Cou...')
#1 C:\xampp\htdocs\2612-doctrine\vendor\doctrine\dbal\src\Connection.php(1052): Doctrine\DBAL\Driver\PDO\Connection->prepare('INSERT INTO Cou...')
#2 C:\xampp\htdocs\2612-doctrine\vendor\doctrine\orm\lib\Doctrine\ORM\Persisters\Entity\BasicEntityPersister.php(264): Doctrine\DBAL\Connection->prepare('INSERT INTO Cou...')
#3 C:\xampp\htdocs\2612-doctrine\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php(1145): Doctrine\ORM\Persisters\Entity\BasicEntityPersister->executeInserts()
#4 C:\xampp\htdocs\2612-doctrine\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php(431): Doctrine\ORM\UnitOfWork->executeInserts(Object(Doctrine\ORM\Mapping\ClassMetadata))
#5 C:\xampp\htdocs\2612-doctrine\vendor\doctrine\orm\lib\Doctrine\ORM\EntityManager.php(403): Doctrine\ORM\UnitOfWork->commit(NULL)
#6 C:\xampp\htdocs\2612-doctrine\bin\insert-course.php(14): Doctrine\ORM\EntityManager->flush()
#7 {main}
4 respostas

Bom dia, Tiago tudo bem?

O erro que compartilhou diz que não foi possível localizar uma coluna chamada "nome" na tabela "Course".

SQLSTATE[HY000]: General error: 1 table Course has no column named nome in
Pode compartilhar o código que chama essa função para gravar esses dados nessa tabela, e também o conteúdo dessa tabela para ajudarmos?

Pode ser que você declarou o nome da coluna de outra forma, ou não declarou esse campo na tabela.

Espero ter ajudado.

Att,

Aqui está a ENTITY "COURSE"

namespace Alura\Doctrine\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping\Column;
use Doctrine\ORM\Mapping\Entity;
use Doctrine\ORM\Mapping\GeneratedValue;
use Doctrine\ORM\Mapping\Id;
use Doctrine\ORM\Mapping\ManyToMany;
use Doctrine\ORM\Mapping\Nome;


#[Entity]
class Course
{
    #[Id, GeneratedValue, Column]
    public int $id;

    #[ManyToMany(Student::class, mappedBy: "courses")]
    private Collection $students;

    public function __construct(
        #[Column(type: "string")]
        public string $nome
    )
    {
        $this->students = new ArrayCollection();
    }

    /**
     * @return Collection<student>
     */
    public function students():Collection
    {
        return $this->students;
    }

    public function addStudent(student $student): void
    {
        if($this->students->contains($student)){
            return;
        }
        $this->students->add($student);
        $student->enrollInCourse($this);
    }

}

Estou postando tambem a "insert-course.php"

use Alura\Doctrine\Entity\Phone;
use Alura\Doctrine\Entity\Student;
use Alura\Doctrine\Helper\EntityManagerCreator;

require_once __DIR__ . '/../vendor/autoload.php';

$entityManager = EntityManagerCreator::createEntityManager();

$course= new \Alura\Doctrine\Entity\Course($argv[1]);

$entityManager->persist($course);
$entityManager->flush();

Olá Tiago, obrigado. O código que você compartilhou parece estar OK.

No caso acredito que o erro esteja nesse fonte que executa a query:

#2 C:\xampp\htdocs\2612-doctrine\vendor\doctrine\orm\lib\Doctrine\ORM\Persisters\Entity\BasicEntityPersister.php(264): Doctrine\DBAL\Connection->prepare('INSERT INTO Cou...')

Conseguiu verificar se a tabela possui o campo "nome" e se ele está no formato correto?

Att,

solução!

O vendor é o repositório da api do doctrine. No curso não altera o vendor. Acredito que está errado é na entidade "Course".

BasicEntityPersister.php está na vendor.

#2 C:\xampp\htdocs\2612-doctrine\vendor\doctrine\orm\lib\Doctrine\ORM\Persisters\Entity\BasicEntityPersister.php(264): Doctrine\DBAL\Connection->prepare('INSERT INTO Cou...')

        $stmt      = $this->conn->prepare($this->getInsertSQL());
        $tableName = $this->class->getTableName();