4
respostas

Erro na Relação entre Entidades

Olá alura,

eu estou com erro na relação entre entidades.

App\Entity\Employee::setDecimoTerceiro(): 
Argument #1 ($decimoterceiro) must be of type ?App\Entity\Ativoemp, string given, called in C:\xampp\htdocs\contb\cotab\src\Controller\PagueController.php on line 70
ExceptionLogs 2Stack Trace TypeError in C:\xampp\htdocs\contb\cotab\src\Entity\Employee.php (line 189)
public function getDecimoTerceiro(): 
?string   
{     
return $this->decimoterceiro;  
}    
public function setDecimoTerceiro
(
?Ativoemp $decimoterceiro): void    
{   
$this->decimoterceiro = $decimoterceiro;    
if ($decimoterceiro !==null && $decimoterceiro->    
getATDecimoterceiro() !== $this)
{      
$decimoterceiro->setATDecimoterceiro($this);

Acontece que o symfony esta acusando o sobre erro dos tipos na relação das entidades:

public function setDecimoTerceiro(?Ativoemp $decimoterceiro): void
    {
        $this->decimoterceiro = $decimoterceiro;
        if ($decimoterceiro !==null && $decimoterceiro->
            getATDecimoterceiro() !== $this){
            $decimoterceiro->setATDecimoterceiro($this);
        }
    }

eu ate troquei por string, mas como estou fazendo o if, nao poderia substituir. Não posso alterar, porque vou fazer uma Relação OneToOne Com a entidade Ativoemp:

Employee
$this->decimoterceiro = $decimoterceiro;

Ativoemp
$ativoemp = $ativoempRepository->find($id); // busca no banco
$employee->setDecimoTerceiro($ativoemp);
4 respostas

Olá Tiago, como vai?

Para resolver isso, você deve garantir que, ao chamar o método setDecimoTerceiro, você está passando um objeto do tipo Ativoemp e não uma string. Pelo seu código, parece que você está tentando buscar um objeto Ativoemp do banco de dados e atribuí-lo ao método setDecimoTerceiro.

Aqui está um exemplo de como você pode fazer isso corretamente:

// Supondo que você já tenha o repositório de Ativoemp
$ativoemp = $ativoempRepository->find($id); // busca no banco

if ($ativoemp instanceof Ativoemp) {
    $employee->setDecimoTerceiro($ativoemp);
} else {
    // Tratamento de erro caso não encontre o Ativoemp
    throw new \Exception("Ativoemp não encontrado para o ID fornecido.");
}

Certifique-se de que a variável $ativoemp realmente contenha um objeto Ativoemp antes de passá-lo para o método setDecimoTerceiro. Isso deve resolver o erro de tipo que você está enfrentando.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Bom dia, como ficaria essa aplicação acima com a operação OneToOne abaixo?

Entidade Employee

public function getDecimoTerceiro(): ?string
{
   return $this->decimoterceiro;
}


public function setDecimoTerceiro(?Ativoemp $decimoterceiro): void
{
   $this->decimoterceiro = $decimoterceiro;
   if ($decimoterceiro !==null && $decimoterceiro->
       getATDecimoterceiro() !== $this){
       $decimoterceiro->setATDecimoterceiro($this);
   }
}
public function setATDecimoterceiro(?Ativoemp $atdecimoterceiro):static{
   $this->atdecimoterceiro = $atdecimoterceiro;
   if ($atdecimoterceiro !==null && $atdecimoterceiro->getDecimoterceiro() !== $this){
       $atdecimoterceiro->setDecimoterceiro($this);
   }
   return $this;
}

Entidade Ativoemp

public function getATDecimoterceiro(): ?Employee
{
   return $this->atdecimoterceiro;
}


/**
* @param string|null $atdecimoterceiro
*/
public function setATDecimoterceiro(?string $atdecimoterceiro): void
{
   $this->atdecimoterceiro = $atdecimoterceiro;
}

PagueController

public function addEmployee(Request $request):Response
{
   // Dados do Employee
   $name = $request->request->get('name');
   $cpf = $request->request->get('cpf');


   $faltasJustificadas = $request->request->get('faltasjustificadas');
   $faltasInjustificadas =$request->request->get('faltasinjustificadas');
   $decimoterceiroValue=$request->request->get('decimoterceiro');
   $acidentado=$request->request->get('acidentado');
   $ferias=$request->request->get('ferias');
   $daywork=$request->request->get('daywork');
   $ativo=$request->request->get('ativo');




   // Criar Employee
   $employee = new Employee($name);
   $employee->setCpf($cpf);
   $employee->setFaltasJustificadas($faltasJustificadas);
   $employee->setFaltasInjustificadas($faltasInjustificadas);
   $employee->setDecimoterceiro($decimoterceiroValue);
   $employee->setAcidentado($acidentado);
   $employee->setFerias($ferias);
   $employee->setDaywork($daywork);
   $employee->setAtivo($ativo);


   // Criação dos objetos Ativoemp separados para cada campo
   if ($decimoterceiroValue) {
       $ativoDecimoTerceiro = new Ativoemp();
       // Configure os valores necessários no objeto Ativoemp
       $employee->setDecimoterceiro($ativoDecimoTerceiro);
   }




   // Verificar se tem dependentes
   if ($request->request->get('tem_dependentes')) {
       // Dados dos Numerosocial (filhos)
       $nomesFilhos = $request->request->all('nome_filho');
       $cpfsFilhos = $request->request->all('cpf_filho');


       // Adicionar Numerosocial (filhos) ao Employee
       foreach ($nomesFilhos as $index => $nomeFilho) {
           if (!empty($nomeFilho) && !empty($cpfsFilhos[$index])) {
               $numerosocial = new Numerosocial();
               $numerosocial->setNomeFilho($nomeFilho);
               $numerosocial->setCpfFilho($cpfsFilhos[$index]);
               $numerosocial->setEmployee($employee);


               $this->numerosocialRepository->add($numerosocial, false);
           }
       }
   }




   $this->employeeRepository->add($employee, true);


   return $this->redirectToRoute('app_pague');
}


#[Route('/pague/create/add-dependente', name: 'app_pague_add_dependente')]
public function addDependente(Request $request): Response
{
   $current = $request->query->get('current', 1);
   return $this->redirectToRoute('app_pague_create', [
       'dependentes' => $current + 1
   ]);
}

link do git: git@github.com:tiagobrandao03/cotab.git

Oi, Tiago! Tudo bem?

Sobre sua questão, há um problema na incompatibilidade de tipos entre os métodos setATDecimoterceiro() e a relação que você quer estabelecer com a entidade Employee.

Você está implementando uma relação OneToOne, mas na entidade Ativoemp o método setATDecimoterceiro está tipado para aceitar ?string, enquanto deveria aceitar um objeto da classe Employee, como já está no método getATDecimoterceiro().

Para corrigir isso, ajuste o tipo do parâmetro no método setATDecimoterceiro() da entidade Ativoemp. Veja como fazer:


public function setATDecimoterceiro(?Employee $atdecimoterceiro): void
{
    $this->atdecimoterceiro = $atdecimoterceiro;
}

Isso vai eliminar o erro de tipo e manter a coerência com a sua modelagem OneToOne entre Employee e Ativoemp.

Além disso, como você já está garantindo o relacionamento bidirecional com:


if ($atdecimoterceiro !== null && $atdecimoterceiro->getDecimoterceiro() !== $this) {
    $atdecimoterceiro->setDecimoterceiro($this);
}

Esse ajuste garante que ambos os lados da relação estejam corretos.

Fico à disposição.

Eu fiz umas correções aqui, so que apareceu esse erro:

An exception occurred while executing a query: 
SQLSTATE[23000]: Integrity constraint violation: 19 NOT NULL constraint failed: ativoemp.dias_trabalho
Exceptions 3Logs 1Stack Traces 3

Doctrine\DBAL\Exception\
NotNullConstraintViolationException
in C:\xampp\htdocs\contb\cotab\vendor\doctrine\dbal\src\Driver\API\SQLite\ExceptionConverter.php (line 48)

        if (       
        strpos($exception->getMessage(), 'may not be NULL') !== false ||       
        strpos($exception->getMessage(), 'NOT NULL constraint failed') !== false    
        ) {     
        return new NotNullConstraintViolationException($exception, $query);   
        }   
        if (strpos($exception->getMessage(), 'no such table:') !== false) {       
        return new TableNotFoundException($exception, $query);    
        }

controller

$dayworkRaw = $request->request->get('daywork');     // ex.: "15"

        if (is_numeric($dayworkRaw) && $dayworkRaw >= 1 && $dayworkRaw <= 30) {

            $ativoDias = new Ativoemp();
            $ativoDias->setDiasTrabalho((string) $dayworkRaw); // Sempre salva como string, como você quer

            $employee->setDaywork($ativoDias);

        } else {
            // Se não for válido, ainda assim cria para evitar NULL no banco
            $ativoDias = new Ativoemp();
            $ativoDias->setDiasTrabalho('0'); // valor padrão de segurança (ou pode lançar erro se preferir)

            $employee->setDaywork($ativoDias);
        }

link do git: git@github.com:tiagobrandao03/cotab.git