FETCH_CLASS does not display parent class values

1

I'm using FETCH_CLASS to map classes, but when for example one class inherits another, FETCH_CLASS does not find the attributes of the parent class and ends up creating new attributes

class UsuarioVO {

    private $id;
    private $nome;
    private $cidade;
    private $estado;
    private $bairro;
    private $cep;
    private $endereco;
    private $cpf;
    private $email;
    private $senha;

    function __construct() {

    }

    function getId() {
        return $this->id;
    }

    function setId($id) {
        $this->id = $id;
    }

    function getNome() {
        return $this->nome;
    }

    function getCidade() {
        return $this->cidade;
    }

    function getEstado() {
        return $this->estado;
    }

    function getBairro() {
        return $this->bairro;
    }

    function getCep() {
        return $this->cep;
    }

    function getEndereco() {
        return $this->endereco;
    }

    function getCpf() {
        return $this->cpf;
    }

    function getEmail() {
        return $this->email;
    }

    function getSenha() {
        return $this->senha;
    }

    function setNome($nome) {
        $this->nome = $nome;
    }

    function setCidade($cidade) {
        $this->cidade = $cidade;
    }

    function setEstado($estado) {
        $this->estado = $estado;
    }

    function setBairro($bairro) {
        $this->bairro = $bairro;
    }

    function setCep($cep) {
        $this->cep = $cep;
    }

    function setEndereco($endereco) {
        $this->endereco = $endereco;
    }

    function setCpf($cpf) {
        $this->cpf = $cpf;
    }

    function setEmail($email) {
        $this->email = $email;
    }

    function setSenha($senha) {
        $this->senha = $senha;
    }

}


Class AlunoVO extends UsuarioVO {

    private $curso;
    private $turma;
    private $matricula;
    private $desconto_mensalidade;
    private $dia_vencimento;

    function __construct() {
        //parent::__construct();        
    }

    function getDia_vencimento() {
        return $this->dia_vencimento;
    }

    function setDia_vencimento($dia_vencimento) {
        $this->dia_vencimento = $dia_vencimento;
    }

    function getCurso() {
        return $this->curso;
    }

    function getTurma() {
        return $this->turma;
    }

    function getMatricula() {
        return $this->matricula;
    }

    function getDesconto_mensalidade() {
        return $this->desconto_mensalidade;
    }

    function setCurso($curso) {
        $this->curso = $curso;
    }

    function setTurma($turma) {
        $this->turma = $turma;
    }

    function setMatricula($matricula) {
        $this->matricula = $matricula;
    }

    function setDesconto_mensalidade($desconto_mensalidade) {
        $this->desconto_mensalidade = $desconto_mensalidade;
    }

}

The object looks like this:

        (
        [curso:AlunoVO:private] => Pedagogia
        [turma:AlunoVO:private] => 
        [matricula:AlunoVO:private] => 
        [desconto_mensalidade:AlunoVO:private] => 
        [dia_vencimento:AlunoVO:private] => 
        [id:UsuarioVO:private] => 
        [nome:UsuarioVO:private] => 
        [cidade:UsuarioVO:private] => 
        [estado:UsuarioVO:private] => 
        [bairro:UsuarioVO:private] => 
        [cep:UsuarioVO:private] => 
        [endereco:UsuarioVO:private] => 
        [cpf:UsuarioVO:private] => 
        [email:UsuarioVO:private] => 
        [senha:UsuarioVO:private] => 
        [id] => 2
        [nome] => joão amaral da silva campos
        [document_cpf] => 05469464550
    )

How do I resolve this?

Method that makes use of classes:

    function listarAlunos($curso = null) {

    try {
        if (!empty($curso)) {
            $listar_alunos = $this->conexao->prepare("SELECT u.id, u.nome, c.nome AS curso, u.document_cpf  FROM usuarios u, matriculas m, cursos c, polos p WHERE (m.aluno = u.id) AND (m.curso = c.id) AND (c.polo = p.id) AND m.curso = :curso");
            $listar_alunos->bindValue(":curso", $curso);
        } else {
            $listar_alunos = $this->conexao->prepare("SELECT u.id, u.nome, c.nome AS curso, u.document_cpf FROM usuarios u, matriculas m, cursos c, polos p WHERE (m.aluno = u.id) AND (m.curso = c.id) AND (c.polo = p.id)");
        }

        if(!$listar_alunos->execute()){
            throw new Exception($listar_alunos->errorInfo()[2]);
        }

        return $listar_alunos->fetchAll(PDO::FETCH_CLASS, "AlunoVO");

    } catch (Exception $e) {
        echo 'Error ao listar alunos -> '.$e->getMessage();
    }
}
    
asked by anonymous 31.03.2018 / 04:11

1 answer

1

Simple your SQL does not bring the fields that are from your base class, please note that I've changed your code a bit and have only broken down the fields of 4 fields ( u.id, u.nome, c.nome AS curso, u.document_cpf ) and others, check

function listarAlunos($curso = null) 
{

    $sql = " SELECT u.id, u.nome, c.nome AS curso, u.document_cpf ";
    $sql .= " FROM usuarios u, matriculas m, cursos c, polos p WHERE "; 
    $sql .= " (m.aluno = u.id) AND (m.curso = c.id) AND (c.polo = p.id) ";

    try {
        if (!empty($curso)) 
        {           
            $listar_alunos = $this->conexao->prepare($sql. " AND m.curso = :curso");
            $listar_alunos->bindValue(":curso", $curso);
        } 
        else 
        {
            $listar_alunos = $this->conexao->prepare($sql);
        }

        if(!$listar_alunos->execute()){
            throw new Exception($listar_alunos->errorInfo()[2]);
        }

        return $listar_alunos->fetchAll(PDO::FETCH_CLASS, "AlunoVO");

    } 
    catch (Exception $e) 
    {
        echo 'Error ao listar alunos -> '.$e->getMessage();
    }
}

Then just discriminate the missing fields in your SQL so that the object of this class loads the fields correctly:

$sql = " SELECT u.id, u.nome, c.nome AS curso, u.document_cpf ";

// Incluir os campos que faltam, porque, sem eles acontece o problema
$sql .= "turma, matricula"; 

$sql .= " FROM usuarios u, matriculas m, cursos c, polos p WHERE "; 
$sql .= " (m.aluno = u.id) AND (m.curso = c.id) AND (c.polo = p.id) ";
    
31.03.2018 / 15:24