skip to Main Content

i have a upload from where i would like to show all the catégories from the database but i keep getting an error with the EntityType i don’t know why was working before.

This is the error: Cannot assign DoctrineORMPersistentCollection to property AppEntityCategory::$posts of type DoctrineCommonCollectionsArrayCollection

<?php

declare(strict_types=1);

namespace AppEntity;

use AppRepositoryCategoryRepository;
use DoctrineCommonCollectionsArrayCollection;
use DoctrineCommonCollectionsCollection;
use DoctrineORMMapping as ORM;

/**
 * @ORMEntity(repositoryClass=CategoryRepository::class)
 */
class Category
{
    /**
     * @ORMId
     * @ORMGeneratedValue
     * @ORMColumn(type="integer")
     */
    private int $id;

    /**
     * @ORMColumn(type="string", length=255)
     */
    private string $name;

    /**
     * @ORMOneToMany(targetEntity=Post::class, mappedBy="Category_id")
     */
    private ArrayCollection $Posts;

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

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getName(): ?string
    {
        return $this->name;
    }

    public function setName(string $name): self
    {
        $this->name = $name;

        return $this;
    }

    /**
     * @return Collection|Post[]
     */
    public function gePosts(): Collection
    {
        return $this->posts;
    }

    public function addPost(Post $post): self
    {
        if (!$this->posts->contains($post)) {
            $this->$posts[] = $posts;
            $post->setCategoryId($this);
        }

        return $this;
    }

    public function removePost(Post $post): self
    {
        if ($this->posts->removeElement($post)) {
            // set the owning side to null (unless already changed)
            if ($post->getCategoryId() === $this) {
                $post->setCategoryId(null);
            }
        }

        return $this;
    }
    public function __toString(): string
    {
        return (string) $this->getName();
    }
}

The upload Form where i am getting the error

<?php

declare(strict_types=1);

namespace AppFormPost;

use AppEntityCategory;
use AppEntityPost;
use SymfonyBridgeDoctrineFormTypeEntityType;
use SymfonyComponentFormAbstractType;
use SymfonyComponentFormExtensionCoreTypeFileType;
use SymfonyComponentFormExtensionCoreTypeTextareaType;
use SymfonyComponentFormExtensionCoreTypeTextType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentOptionsResolverOptionsResolver;
use SymfonyComponentValidatorConstraintsFile;
use SymfonyComponentValidatorConstraintsNotBlank;

class UploadType extends AbstractType
{
    /**
     * @param SymfonyComponentFormFormBuilderInterface $builder
     * @param array                                        $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title', TextType::class, [
                
                'constraints' => [
                    new NotBlank([
                        'message' => 'Please enter a valid Title. '
                    ])
                ]
            ])
            ->add('category', EntityType::class, [
                'mapped' => false,
                'class' => Category::class,
                'choice_label' => 'name',
                'expanded' => true
            ])
            ->add('poster', FileType::class, [
                'required' => false,
                'constraints' => [
                    new File([
                        'maxSize' => '6000K',
                        'mimeTypes' => [
                            'image/x-png',
                            'image/jpeg',
                        ],
                        'mimeTypesMessage' => 'Please upload a image file.'
                    ])
                ]
            ])
            ->add('description', TextareaType::class, [
                'constraints' => [
                    new NotBlank([
                        'message' => 'Please enter a valid Title. '
                    ])
                ]
            ])
            ->add('mediainfo', TextareaType::class, [
                'required' => false,
            ]);
    }
    
    /**
     * @param SymfonyComponentOptionsResolverOptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Post::class,
        ]);
    }
}

in the Post entity

   /**
     * @ORMManyToOne(targetEntity=Category::class, inversedBy="posts")
     */
    private Category $Category_id;

Environment info:

  • Symfony 5.2.5 (env: dev, debug: true)
  • PHP Version: 8.0.3
  • Database Driver & Version: 8.0.23-0ubuntu0.20.04.1

4

Answers


  1. Chosen as BEST ANSWER

    After some digging a found the answer changing the ArrayCollection to Collection fixed my issue

    change:

    /**
     * @ORMOneToMany(targetEntity=Post::class, mappedBy="Category_id")
     */
    private DoctrineCommonCollectionsArrayCollection $posts;
    

    to:

    /**
     * @ORMOneToMany(targetEntity=Post::class, mappedBy="Category_id")
     */
    private DoctrineCommonCollectionsCollection $posts;
    

  2. $this->$posts[] = $posts;

    Looks like this line should be:

    $this->$posts[] = $post;

    Login or Signup to reply.
  3. The problem is in th type hinting (ArrayCollection => Collection)

    change:

    /**
     * @ORMOneToMany(targetEntity=Post::class, mappedBy="Category_id")
     */
    private ArrayCollection $Posts;
    
    public function __construct()
    {
        $this->posts = new ArrayCollection();
    }
    

    by:

    /**
     * @ORMOneToMany(targetEntity=Post::class, mappedBy="Category_id")
     */
    private Collection $Posts;
    
    public function __construct()
    {
        $this->posts = new ArrayCollection();
    }
    
    Login or Signup to reply.
  4. private ArrayCollection $posts;
    

    is a direct dependence to Doctrine :

    use DoctrineCommonCollectionsArrayCollection;
    

    If you desagree, perhaps because it breaks the SOLID "D", try to use the pure php pseudo type Iterable (https://www.php.net/manual/en/language.types.iterable.php), like this:

    private iterable $posts;
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search