FETCH_CLASS does not arrow parent class values

Asked

Viewed 54 times

0

I am using FETCH_CLASS to map the 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 comes 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 fix it?

Method that makes use of the 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();
    }
}
  • 1

    You can edit and place the code that generated this problem?

  • @Virgilionovic I edited the question, from a look there.

1 answer

1


Simple to your SQL does not bring the fields that are of its base class, note, that I changed a little its code and has only discriminated the fields of 4 fields (u.id, u.nome, c.nome AS curso, u.document_cpf) and the 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 fields that are missing in your SQL so that the object of this class correctly loads the fields:

$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) ";
  • It worked, thank you. I saw around that this method is unreliable and that the correct would be to use a ready ORM, but I found it much more practical to use the way I know above, you know tell me something about it or indicates some link that I can better inform me?

  • @Leandrosilvacampos I like the idea ORM, but everything has a price and a dosage. I use hj more ORM because I write less and keep default in my code.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.