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

Erro Doctrine - Coluna $nome não identificada

Olá Alura,

aqui está o link:

Eu codei a coluna "$nome" na "funcion __construct() ":

class Course
{
...
public function __construct(
 #[Column]
        public readonly string $nome
    )
    {
    ...
    }
...
}
git@github.com:tiagobrandao03/2612-doctrine.git

Eu mapeei a Coluna nome e ela mostrou que não tinha dados inseridos. Ate ai tudo certo:

php bin/doctrine.php orm:info
Found 3 mapped entities:
 [OK]   Alura\Doctrine\Entity\Course
 [OK]   Alura\Doctrine\Entity\Phone
 [OK]   Alura\Doctrine\Entity\Student
php bin/doctrine.php orm:mapping:describe Course
 Identifier ["id"]	; Table {"name": "Course" }; targetEntity  Alura\Doctrine\Entity\Student; sourceEntity  Alura\Doctrine\Entity\Course; 
php bin/doctrine.php orm:mapping:describe Student 
 Identifier ["id"]	; Table {"name": "Student" };

fieldName  courses
      joinTable  {  "name": "student_course",  
"joinColumns": [  { "name": "student_id", "referencedColumnName": "id", "onDelete": "CASCADE" }  ], "inverseJoinColumns": [{
                       "name": "course_id", "referencedColumnName": "id","onDelete":              "CASCADE"}]}

php bin/doctrine.php orm:validate-schema [OK] The mapping files are correct.

php bin/doctrine.php orm:schema-tool:update --dump-sql  
ALTER TABLE Course ADD COLUMN nome VARCHAR(255) NOT NULL;
php bin/doctrine.php orm:schema-tool:update --force
 Updating database schema…
In ExceptionConverter.php line 83:
An exception occurred while executing a query: SQLSTATE[HY000]: General error: 1 Cannot add a NOT NULL column with default value NULL
In Exception.php line 28:
SQLSTATE[HY000]: General error: 1 Cannot add a NOT NULL column with default value NULL

Depois eu fiz um insert e aqui esta o erro. Nãoe sei se tem a ver com a ortografia ou sqlite:

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

A questão é que o prompt acusa que tem o erro no doctrine e não é, acredito que seja um erro em alguma coisa que eu deixei passar.

5 respostas

Olá Tiago,

Entendi o problema que você está enfrentando com a coluna nome no Doctrine. Parece que você está tentando adicionar uma coluna nome que não permite valores nulos, mas o banco de dados não está conseguindo adicionar essa coluna porque ele não pode definir um valor padrão para ela.

O erro específico que você está recebendo é:

SQLSTATE[HY000]: General error: 1 Cannot add a NOT NULL column with default value NULL

Esse erro ocorre porque o banco de dados não pode adicionar uma coluna NOT NULL sem um valor padrão quando já existem registros na tabela.

Aqui está uma abordagem para resolver isso:

  1. Adicionar a coluna com um valor padrão temporário: Primeiro, adicione a coluna nome permitindo valores nulos ou com um valor padrão temporário.

    ALTER TABLE Course ADD COLUMN nome VARCHAR(255) DEFAULT 'temp_nome';
    
  2. Atualizar os registros existentes: Atualize os registros existentes para definir um valor válido para a coluna nome.

    UPDATE Course SET nome = 'nome_valido' WHERE nome = 'temp_nome';
    
  3. Alterar a coluna para NOT NULL: Agora que todos os registros têm um valor válido, altere a coluna para NOT NULL.

    ALTER TABLE Course ALTER COLUMN nome SET NOT NULL;
    
  4. Remover o valor padrão, se necessário: Se você não quiser um valor padrão para a coluna nome, você pode removê-lo.

    ALTER TABLE Course ALTER COLUMN nome DROP DEFAULT;
    

No seu código, você pode refletir essas mudanças no mapeamento da entidade:

class Course
{
    // Outras propriedades e métodos...

    #[Column(type: "string", length: 255, nullable: false)]
    public readonly string $nome;

    public function __construct(string $nome)
    {
        $this->nome = $nome;
    }

    // Outras propriedades e métodos...
}

Depois disso, você pode executar novamente os comandos do Doctrine para atualizar o esquema do banco de dados:

php bin/doctrine.php orm:schema-tool:update --force

Espero ter ajudado e bons estudos!

Olá Rodrigo,

Eu fiz a inserção no "Course"

class Course
{
    // Outras propriedades e métodos...

    #[Column(type: "string", length: 255, nullable: false)]
    public readonly string $nome;

    public function __construct(string $nome)
    {
        $this->nome = $nome;
    }

    // Outras propriedades e métodos...
}

e usei o comando no terminal: php bin/doctrine.php orm:schema-tool:update --force

Resposta do terminal:

 Updating database schema...
In ExceptionConverter.php line 83:
  An exception occurred while executing a query: SQLSTATE[HY000]: General error: 1 Cannot add a NOT NULL column with
  default value NULL

In Exception.php line 28:

  SQLSTATE[HY000]: General error: 1 Cannot add a NOT NULL column with default value NULL

In Connection.php line 33:

  SQLSTATE[HY000]: General error: 1 Cannot add a NOT NULL column with default value NULL

orm:schema-tool:update [--em EM] [--complete] [--dump-sql] [-f|--force]

Esse é erro agora. Como eu fço para executar sql query em uma em uma classe ou em um prompt? ALTER TABLE Course ADD COLUMN nome VARCHAR(255) DEFAULT 'temp_nome';

Deixe um valor padrão na definição da coluna então:

#[Column(type: "string", length: 255, nullable: false, options: ["default" => "SEM_NOME"])]
public readonly string $nome;

E execute o php bin/doctrine.php orm:schema-tool:update --force

Se já tiver registros na sua tabela, todos vão ficar com a coluna nome contendo o valor SEM_NOME, que você pode atualizar posteriormente.

Consegui resolver:

C:\xampp\htdocs\2612-doctrine>php bin/insert-course.php "php"

C:\xampp\htdocs\2612-doctrine>php bin/doctrine.php dbal:run-sql "SELECT * FROM COURSE"
 ---- ----------
  id   nome
 ---- ----------
  1    SEM_NOME
  2    SEM_NOME
  3    SEM_NOME
  4    SEM_NOME
  5    SEM_NOME
  6    SEM_NOME
  7    SEM_NOME
  8    php
 ---- ----------

Aproveitando, para rodar comandos sql eu uso esse comando abaixo? Exemplo: php bin/doctrine.php dbal:run-sql

solução!

Boa!

Dessa forma você executa comandos sql via doctrine, mas outra alternativa é acessar o banco de dados diretamente no seu computador. Isso vai depender do banco de dados e de como ele foi instalado no seu computador.

Bons estudos!