Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

ORM não está conseguindo relacionar o atributo $especialidade à coluna especialidade_id

Bom dia, estou com um problema no mapeamento da minha classe, mas antes, não tem relação com a minha dúvida, mas tem um erro na transcrição da aula, abaixo do vídeo tem esse trecho de código:

public function jsonSerialize()
{
    return [
        'id' => $this->getId(),
        'crm' => $this->getCrm(),
        'nome' => $this->getNome(),
//erro abaixo
        'especialidadeId' => $this->getEspecialidade()=>getId()
    ];
}

acho que o correto é assim:

        'especialidadeId' => $this->getEspecialidade()->getId()
    ];
}

Quanto à minha dúvida, quando tento fazer um post para inserir um médico é me apresentado o seguinte erro:

An exception occurred while executing 'INSERT INTO medico (crm, nome, especialidade_id) VALUES (?, ?, ?)' with params [123456, "primeiro m\u00e9dico", null]:

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'especialidade_id' cannot be null

Ao que me parece a ORM não está conseguindo relacionar o atributo $especialidade à coluna especialidade_id e não sei onde estou errando.

Medico.php

<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
 * @ORM\Entity()
 */
class Medico implements \JsonSerializable{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;
    /**
     * @ORM\Column(type="integer")
     */
    private $crm;
    /**
     * @ORM\Column(type="string")
     */
    private $nome;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Especialidade")
     * @ORM\JoinColumn(nullable=false)
     */
    private $especialidade;

    public function getId(): ?int
    {
        return $this->id;
    }
    public function getCrm(): ?int
    {
        return $this->crm;
    }
    public function setCrm(int $crm): self
    {
        $this->crm = $crm;
        return $this;
    }
    public function getNome(): ?string
    {
        return $this->nome;
    }
    public function setNome($nome): self
    {
        $this->nome = $nome;
        return $this;
    }
    public function getEspecialidade(): ?Especialidade
    {
        return $this->Especialidade;
    }
    public function setEspecialidade(?Especialidade $especialidade): self
    {
        $this->Especialidade = $especialidade;

        return $this;
    }
    public function jsonSerialize()
    {
        return [
            'id' => $this->getId(),
            'crm' => $this->getCrm(),
            'nome' => $this->getNome(),
            'especialidadeId' => $this->getEspecialidade()->getId()
        ];
    }
}

MedicoFactory.php

<?php
namespace App\Helper;

use App\Entity\Medico;
use App\Repository\EspecialidadeRepository;

class MedicoFactory{

    /**
     * @var EspecialidadeRepository
     */
    private $especialidadeRepository;

    public function __construct(EspecialidadeRepository $especialidadeRepository)
    {
        $this->especialidadeRepository = $especialidadeRepository;
    }


    public function criarMedico(string $json): Medico{

        $dadosEmJson = json_decode($json);
        $especialidadeId = $dadosEmJson->especialidadeId;
        $especialidade = $this->especialidadeRepository->find($especialidadeId);

        $medico = new Medico();
        $medico
            ->setCrm($dadosEmJson->crm)
            ->setNome($dadosEmJson->nome)
            ->setEspecialidade($especialidade);

        return $medico;

    }
}

Dá para identificar só por esses arquivos o erro?

1 resposta
solução!

Seu erro está na classe médico:

$this->Especialidade

O atributo mapeado é especialidade. Você está atribuindo a Especialidade. ;-)

PS.: Obrigado pelo aviso sobre o erro na transcrição. Já corrigi lá. :-D