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

dql não retorna valores

ao tentar obter relação de alunos juntamente com seus telefones e cursos o prompt só retorna isso:

Doctrine\DBAL\Logging\DebugStack Object
(
    [queries] => Array
        (
            [1] => Array
                (
                    [sql] => SELECT a0_.id AS id_0, a0_.nome AS nome_1, t1_.id AS id_2, t1_.numero AS numero_3, c2_.id AS id_4, c2_.nome AS nome_5, t1_.aluno_id AS aluno_id_6 FROM Aluno a0_ INNER JOIN Telefone t1_ ON a0_.id = t1_.aluno_id INNER JOIN curso_aluno c3_ ON a0_.id = c3_.aluno_id INNER JOIN Curso c2_ ON c2_.id = c3_.curso_id
                    [params] => Array
                        (
                        )

                    [types] => Array
                        (
                        )

                    [executionMS] => 0.00032901763916016
                )

        )

    [enabled] => 1
    [start] => 1573075393.6494
    [currentQuery] => 1
)

o relatorio-cursos-por-aluno-dql.php

<?php


use Alura\Doctrine\Entity\Aluno;
use Alura\Doctrine\Entity\Telefone;
use Alura\Doctrine\Helper\EntityManagerFactory;
use Doctrine\DBAL\Logging\DebugStack;

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

$entityManagerFactory = new EntityManagerFactory();
$entityManager = $entityManagerFactory->getEntityManager();
$alunosRepository = $entityManager->getRepository(Aluno::class);

$debugStack = new DebugStack();
$entityManager->getConfiguration()->setSQLLogger($debugStack);

$classeAluno = Aluno::class;
$dql = "SELECT aluno, telefones, cursos FROM $classeAluno aluno JOIN aluno.telefones telefones JOIN aluno.cursos cursos";
$query = $entityManager->createQuery($dql);

/**
 * @ Aluno [] $alunos
 */
$alunos = $query->getResult();

foreach ($alunos as $aluno) {
    $telefones = $aluno->getTelefones()->map(function (Telefone $telefone) {
        return $telefone->getNumero();
    })->toArray();
    echo "ID: {$aluno->getId()}\n";
    echo "Nome: " . $aluno->getNome() . "\n";
    echo "telefone: " . implode(", ", $telefones) . "\n";
    $cursos = $aluno->getCursos();
    foreach ($cursos as $curso) {

        echo "\tID Curso: {$curso->getId()} \n";
        echo "\tCurso: {$curso->getNome()} \n";
        echo "\n";

    }
    echo "\n";
}

print_r($debugStack);


?>

o que pode ser?

6 respostas

Fala, Marcos! Sem DQL você consegue buscar os dados (ou seja, os dados estão realmente no banco)?

Se sim, compartilha seu projeto todo no github pra eu dar uma olhada, por favor? Por aqui direto é meio complicado de analisar.

cara.... pra falar a verdade acho que vou preferir desistir do curso e seguir adiante em outro, são muitos arquivos e o github me deu uma surra.

Tem curso de Git e GitHub aqui na Alura tbm. rsrsrsrsrs

só consegui subir como zip. mesmo a interface grafica do github é impossível.

o link:

https://github.com/marvinoliveiras/Doctrine3

solução!

Fala, Marcos. Cara, fui longe pra achar seu problema. rsrsrsr

O problema tá no vincular-aluno-curso.php. Você não está salvando o vínculo no banco de dados, logo, quando no relatório você tenta buscar os cursos por aluno, não tem nenhum curso, então nenhum dado é retornado.

Basta corrigir o arquivo de vincular os alunos aos cursos e realizar alguns vínculos para seu relatório funcionar.

Caso queira buscar os alunos independente de terem cursos vinculados ou não, basta usar o LEFT JOIN na cláusula que une os cursos na DQL.

Abração e bons estudos!

PS.: Super recomendo que você faça os cursos de Git e GitHub quando finalizar esse. É muito importante para que os desenvolvedores saibam trabalhar com versionamento de código

verdade, no arquivo vincular-aluno-curso.php faltava apenas a linha:

$entityManager->flush();

depois que adicionei passou a vincular.