Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Dúvida em buscar alunos

Olá, pessoal!

Estou com dificuldade para entender o erro que surgiu ao buscar os alunos. O meu arquivo buscar-alunos.php está assim:

use Alura\Doctrine\Entity\Aluno;
    use Alura\Doctrine\Entity\Telefone;
    use Alura\Doctrine\Helper\EntityManagerFactory;

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


    $entityManagerFactory = new EntityManagerFactory();
    $entityManager = $entityManagerFactory->getEntityManager();

    $alunoRepository = $entityManager->getRepository(Aluno::class);

    /** @var Aluno[] $alunoList     */
    $alunoList = $alunoRepository->findAll();

    foreach ($alunoList as $aluno) :
        $telefones = $aluno
        ->getTelefones()
        ->map(function (Telefone $telefone) {
            return $telefone->getNumero();
        })
        ->toArray();

        echo "ID: {$aluno->getId()}\n";
        echo "Nome: {$aluno->getNome()}\n";
        echo "Telefones: " . implode(', ', $telefones);

        echo "\n\n";
    endforeach;

E o erro exibido no prompt de comando é:

C:\Edesign\alura\php\doctrine\doctrine-alura>php commands\buscar-alunos.php
PHP Notice:  Undefined index: Aluno in C:\Edesign\alura\php\doctrine\doctrine-alura\vendor\doctrine\orm\lib\Doctrine\ORM\Persisters\Entity\BasicEntityPersister.php on line 1779

Notice: Undefined index: Aluno in C:\Edesign\alura\php\doctrine\doctrine-alura\vendor\doctrine\orm\lib\Doctrine\ORM\Persisters\Entity\BasicEntityPersister.php on line 1779
PHP Notice:  Trying to access array offset on value of type null in C:\Edesign\alura\php\doctrine\doctrine-alura\vendor\doctrine\orm\lib\Doctrine\ORM\Persisters\Entity\BasicEntityPersister.php on line 1783

Notice: Trying to access array offset on value of type null in C:\Edesign\alura\php\doctrine\doctrine-alura\vendor\doctrine\orm\lib\Doctrine\ORM\Persisters\Entity\BasicEntityPersister.php on line 1783
PHP Warning:  Invalid argument supplied for foreach() in C:\Edesign\alura\php\doctrine\doctrine-alura\vendor\doctrine\orm\lib\Doctrine\ORM\Persisters\Entity\BasicEntityPersister.php on line 1783

Warning: Invalid argument supplied for foreach() in C:\Edesign\alura\php\doctrine\doctrine-alura\vendor\doctrine\orm\lib\Doctrine\ORM\Persisters\Entity\BasicEntityPersister.php on line 1783
PHP Notice:  Undefined index: Aluno in C:\Edesign\alura\php\doctrine\doctrine-alura\vendor\doctrine\orm\lib\Doctrine\ORM\PersistentCollection.php on line 168

Notice: Undefined index: Aluno in C:\Edesign\alura\php\doctrine\doctrine-alura\vendor\doctrine\orm\lib\Doctrine\ORM\PersistentCollection.php on line 168
PHP Fatal error:  Uncaught Error: Call to a member function setValue() on null in C:\Edesign\alura\php\doctrine\doctrine-alura\vendor\doctrine\orm\lib\Doctrine\ORM\PersistentCollection.php:168
Stack trace:
#0 C:\Edesign\alura\php\doctrine\doctrine-alura\vendor\doctrine\orm\lib\Doctrine\ORM\Internal\Hydration\ObjectHydrator.php(511): Doctrine\ORM\PersistentCollection->hydrateAdd(Object(Alura\Doctrine\Entity\Telefone))
#1 C:\Edesign\alura\php\doctrine\doctrine-alura\vendor\doctrine\orm\lib\Doctrine\ORM\Internal\Hydration\ObjectHydrator.php(162): Doctrine\ORM\Internal\Hydration\ObjectHydrator->hydrateRowData(Array, Array)
#2 C:\Edesign\alura\php\doctrine\doctrine-alura\vendor\doctrine\orm\lib\Doctrine\ORM\Internal\Hydration\AbstractHydrator.php(153): Doctrine\ORM\Internal\Hydration\ObjectHydrator->hydrateAllData()
#3 C:\Edesign\alura\php\doctrine\doctrine-alura\vendor\doctrine\orm\lib\Doctrine\ORM\Persisters\Entity\BasicEntityPersister.php(952): Doctrine\ORM\Internal\Hydration\AbstractHydrator->hydrateAll(Object(Doctrine\DBAL\Dri in C:\Edesign\alura\php\doctrine\doctrine-alura\vendor\doctrine\orm\lib\Doctrine\ORM\PersistentCollection.php on line 168

Fatal error: Uncaught Error: Call to a member function setValue() on null in C:\Edesign\alura\php\doctrine\doctrine-alura\vendor\doctrine\orm\lib\Doctrine\ORM\PersistentCollection.php:168
Stack trace:
#0 C:\Edesign\alura\php\doctrine\doctrine-alura\vendor\doctrine\orm\lib\Doctrine\ORM\Internal\Hydration\ObjectHydrator.php(511): Doctrine\ORM\PersistentCollection->hydrateAdd(Object(Alura\Doctrine\Entity\Telefone))
#1 C:\Edesign\alura\php\doctrine\doctrine-alura\vendor\doctrine\orm\lib\Doctrine\ORM\Internal\Hydration\ObjectHydrator.php(162): Doctrine\ORM\Internal\Hydration\ObjectHydrator->hydrateRowData(Array, Array)
#2 C:\Edesign\alura\php\doctrine\doctrine-alura\vendor\doctrine\orm\lib\Doctrine\ORM\Internal\Hydration\AbstractHydrator.php(153): Doctrine\ORM\Internal\Hydration\ObjectHydrator->hydrateAllData()
#3 C:\Edesign\alura\php\doctrine\doctrine-alura\vendor\doctrine\orm\lib\Doctrine\ORM\Persisters\Entity\BasicEntityPersister.php(952): Doctrine\ORM\Internal\Hydration\AbstractHydrator->hydrateAll(Object(Doctrine\DBAL\Dri in C:\Edesign\alura\php\doctrine\doctrine-alura\vendor\doctrine\orm\lib\Doctrine\ORM\PersistentCollection.php on line 168

Alguém pode me dar um help?

Desde já, agradeço.

21 respostas

Olá, Simone.

Normalmente esse erro aparece quando existe algum erro no mapeamento de relacionamentos.

Vê se esse comando te ajuda a achar o erro:

vendor\bin\doctrine.bat orm:validate-schema

Vinicius,

O retorno não foi muito esclarecedor para mim:

@ECHO OFF
setlocal DISABLEDELAYEDEXPANSION
SET BIN_TARGET=%~dp0/../doctrine/orm/bin/doctrine
php "%BIN_TARGET%" %*

Eu não entendi o que pode estar desabilitado. Agradeço por sua ajuda.

Olá, Simone.

Como você tem executado os comandos do doctrine até agora? Normalmente no Windows é através do .bat, mas eu não uso Windows então não sei te dizer se precisa fazer algo mais.

Tenta php vendor/bin/doctrine ao invés de vendor\bin\doctrine.bat e vê se roda.

Olá, Vinicius

O retorno para php vendor/bin/doctrine orm:validate-schema foi:

dir=$(cd "${0%[/\\]*}" > /dev/null; cd "../doctrine/orm/bin" && pwd)

if [ -d /proc/cygdrive ]; then
    case $(which php) in
        $(readlink -n /proc/cygdrive)/*)
            # We are in Cygwin using Windows php, so the path must be translated
            dir=$(cygpath -m "$dir");
            ;;
    esac
fi

"${dir}/doctrine" "$@"

Confesso que ainda não compreendi a causa nem o erro em si. Agradeço por sua atenção.

Vou repetir a pergunta do último post, Simone:

Como você tem executado os comandos do doctrine até agora?

Desculpe, mas acho que não entendi direito a sua pergunta.

Executei todos os comandos direto no cmd do Windows.

Até esse momento do curso, você executou algum dos comandos do Doctrine como foi feito no curso?

orm:info, etc?

Sim. Até agora eu consegui acompanhar todas as suas aulas, sem nenhum problema.

Como você executou esses comandos que fizemos no curso até agora? Digita aqui, por favor, exatamente como você os digitou no cmd do Windows?

:-)

Esses foram os últimos:

php commands\criar-aluno.php "Fulano" "(24) 99999-9999" "(24) 2222-1234"
php commands\buscar-alunos.php

Não, Simone.

rsrs

Os comandos do Doctrine. Não os arquivos que criamos.

Os comandos do doctrine que executamos para verificar se o mapeamento está ok. Pra criar o schema do banco de dados, etc.

Como eu disse, eu não uso Windows, mas vou chutar aqui já que vc parece um pouco perdida. rsrs

Tenta executar só vendor\bin\doctrine orm:validate-schema. Vê se esse comando funciona e te mostra alguma informação válida.

Ops, agora vai:

C:\Edesign\alura\php\doctrine\doctrine-alura>vendor\bin\doctrine.bat orm:info

 Found 2 mapped entities:

 [OK]   Alura\Doctrine\Entity\Aluno
 [OK]   Alura\Doctrine\Entity\Telefone

C:\Edesign\alura\php\doctrine\doctrine-alura>vendor\bin\doctrine.bat orm:mapping:describe


  Not enough arguments (missing: "entityName").


orm:mapping:describe <entityName>

Você não rodou o comando que eu sugeri, Simone. rsrsrs

Ao invés de orm:mapping:describe ou orm:info, como você colocou nos exemplos acima, digita orm:validate-schema, por favor.

Oi, Simone. Funcionou?

Oi, Vinicius

Eu testei ontem esse comando rsrs

C:\Edesign\alura\php\doctrine\doctrine-alura>php vendor/bin/doctrine orm:validate-schema

dir=$(cd "${0%[/\\]*}" > /dev/null; cd "../doctrine/orm/bin" && pwd)

if [ -d /proc/cygdrive ]; then
    case $(which php) in
        $(readlink -n /proc/cygdrive)/*)
            # We are in Cygwin using Windows php, so the path must be translated
            dir=$(cygpath -m "$dir");
            ;;
    esac
fi

"${dir}/doctrine" "$@"

Simone, vamos de novo.

Sabe o comando que você digitou na sua mensagem que começa com "Ops, agora vai:"?

Então, nele, você vai editar a última parte.

Do último comando que você digitou (vendor\bin\doctrine.bat orm:mapping:describe), troque "orm:mapping:describe" por "orm:validate-schema", ficando:

vendor\bin\doctrine.bat orm:validate-schema.

Vinicius,

C:\Edesign\alura\php\doctrine\doctrine-alura>vendor\bin\doctrine.bat orm:validate-schema

Mapping
-------

 [FAIL] The entity-class Alura\Doctrine\Entity\Aluno mapping is invalid:
 * The association Alura\Doctrine\Entity\Aluno#telefones refers to the owning side field Alura\Doctrine\Entity\Telefone#Aluno which does not exist.


Database
--------


 [ERROR] The database schema is not in sync with the current mapping file.

Tá aí seu erro, Simone. O mapeamento da entidade Aluno tá errada.

Em $telefones que tá na classe Aluno você provavelmente usou o atributo mappedBy ou inversedBy fazendo referência à propriedade $aluno da classe Telefone, mas escreveu algo errado. Pela mensagem, parece que você colocou Aluno em maiúsculo quando a propriedade $aluno na classe Telefone está em minúsculo.

Vinicius,

Desculpe a demora para retornar.

De fato, quando eu coloquei o /mappedBy/, deixei equivocadamente /Aluno/.

Tudo isso serviu como um grande aprendizado.

Agradeço IMENSAMENTE por sua atenção e seu empenho em me ajudar.

solução

Que bom que conseguiu resolver, Simone.

Não se esqueça de marcar o tópico como solucionado.

:-)