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

Cannot assign ArrayCollection to property

Olá Alura,

estou com um erro e preciso de ajuda:

Cannot assign Doctrine\Common\Collections\ArrayCollection to property App\Entity\Employee::$numerosocial of type phpDocumentor\Reflection\Types\Collection

linha do cdigo

in C:\xampp\htdocs\contb\cotab\src\Entity\Employee.php (line 38)
        #[ORM\Column]        private string $name    )    {        $this->numerosocial=new ArrayCollection();    }    public function numerosocial():Collection    {        return $this->numerosocial;    }

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

4 respostas

Olá Tiago, tudo bem?

O erro ocorre porque você está tentando atribuir um objeto ArrayCollection a uma propriedade que espera um tipo diferente, especificamente phpDocumentor\Reflection\Types\Collection.

Para resolver isso, você pode ajustar o tipo da propriedade numerosocial para aceitar um ArrayCollection. Aqui está um exemplo de como você pode fazer isso:

  1. Certifique-se de que a propriedade numerosocial está tipada corretamente. Você pode tipá-la como ArrayCollection ou como uma interface que ArrayCollection implementa, como Collection do Doctrine.
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;

class Employee
{
    private Collection $numerosocial;

    public function __construct()
    {
        $this->numerosocial = new ArrayCollection();
    }

    public function getNumerosocial(): Collection
    {
        return $this->numerosocial;
    }
}
  1. Verifique se a anotação da propriedade está correta. Se você estiver usando anotações do Doctrine, certifique-se de que a propriedade está configurada corretamente para armazenar uma coleção, se for o caso.

  2. Caso esteja usando PHP 8 e atributos, verifique se os atributos estão corretamente configurados.

Ao fazer essas alterações, você deve conseguir resolver o erro de tipo que está enfrentando.

Espero ter ajudado e bons estudos!

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

Eu alterei os dados , A relação entre as entidades é unidimensional(OneToOne) :

//Entidade Employee
#[ORM\Entity(repositoryClass: EmployeeRepository::class)]
class Employee
{

//atributos

#[ORM\OneToOne(
        mappedBy: "employee",
        targetEntity: Numerosocial::class,
        cascade: ["persist", "remove"]
    )]
    private ?Numerosocial $numerosocial = null;
    
    
 public function __construct(
        #[ORM\Column]
        private string $name

    )
    {
//retirei   $this->numerosocial=new ArrayCollection();
    }
    
    
public function numerosocial(): Collection
{
    return $this->numerosocial;
}

public function getNumerosocial(): ?Numerosocial
{
    return $this->numerosocial;
}

public function setNumerosocial(?Numerosocial $numerosocial): void
{

    if ($numerosocial !== null && $numerosocial->getEmployee() !== $this) {
        $numerosocial->setEmployee($this);
    }

    // Se estiver removendo o numerosocial
    if ($numerosocial === null && $this->numerosocial !== null) {
        $this->numerosocial->setEmployee(null);
    }

    $this->numerosocial = $numerosocial;
}
//entidade Numerosocial

    
#[ORM\Entity(repositoryClass: NumerosocialRepository::class)]
class Numerosocial
{

#[ORM\OneToOne(targetEntity: Employee::class, inversedBy: "numerosocial")]
#[ORM\JoinColumn(name: "employee_id", referencedColumnName: "id")]
private ?Employee $employee = null;

public function getEmployee(): ?Employee
{
return $this->employee;
}

public function setEmployee(?Employee $employee): static
{
// unset the owning side of the relation if necessary

if ($employee !== null && $employee->getNumerosocial() !== $this) {
    $employee->setNumerosocial($this);
}

// set the owning side of the relation if necessary
if ($employee === null && $this->employee !== null) {
    $this->employee->setNumerosocial(null);
}

$this->employee = $employee;

return $this;
}

Aconteceu alguns erros:

Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 262144 bytes) in C:\xampp\htdocs\contb\cotab\src\Entity\Numerosocial.php on line 78

Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 262144 bytes) in Unknown on line 0

Oi, Tiago!

Sobre sua última dúvida: o erro de estouro de memória (Fatal error: Allowed memory size...) indica que seu código está entrando em recursão infinita entre os métodos setEmployee() e setNumerosocial() das entidades Employee e Numerosocial.

A causa está nestes trechos:


// Em setNumerosocial() da classe Employee
if ($numerosocial !== null && $numerosocial->getEmployee() !== $this) {
    $numerosocial->setEmployee($this); // <- chama setEmployee()
}

// Em setEmployee() da classe Numerosocial
if ($employee !== null && $employee->getNumerosocial() !== $this) {
    $employee->setNumerosocial($this); // <- chama setNumerosocial()
}

Esses dois métodos estão se chamando mutuamente sem fim, o que consome toda a memória.

Para resolver:

Evite esse ciclo chamando o método complementar somente quando necessário e sem repetir o ciclo. Faça isso de forma mais controlada. Ajuste os dois métodos assim:


// Em Employee.php
public function setNumerosocial(?Numerosocial $numerosocial): void
{
    $this->numerosocial = $numerosocial;

    if ($numerosocial !== null && $numerosocial->getEmployee() !== $this) {
        $numerosocial->setEmployee($this);
    }
}

// Em Numerosocial.php
public function setEmployee(?Employee $employee): static
{
    $this->employee = $employee;

    if ($employee !== null && $employee->getNumerosocial() !== $this) {
        $employee->setNumerosocial($this);
    }

    return $this;
}

Além disso:

  • Remova o método public function numerosocial(): Collection da classe Employee, pois sua relação é OneToOne, e esse método está retornando um tipo Collection, o que não faz sentido.
  • O correto é usar apenas o getNumerosocial() que você já tem, retornando ?Numerosocial.

Fico à disposição.

solução!

Muito Obrigado, Armano! Consegui resolver essa questão! Obrigado Alura e comunidade!