Symfony ArrayCollection与PersistentCollection

编程入门 行业动态 更新时间:2024-10-28 15:19:18
本文介绍了Symfony ArrayCollection与PersistentCollection的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

据我了解,当您通过存储库查询数据库时,您将获得PersistentCollection,而在处理实体时,您将获得ArrayCollection.

As I understood when you query database by repository you get PersistentCollection and when your working with your entities you get ArrayCollection.

所以考虑我的用户实体具有一对多的自引用关系.

so consider I have one to many self referencing relation for my user entity.

在我的用户实体中,我有一个setChildren方法,该方法将用户的ArrayCollection作为参数.

and in my user entity I have a setChildren method which get ArrayCollection of users as argument .

<?php namespace UserBundle\Entity; use Abstracts\Entity\BaseModel; use CertificateBundle\Entity\Certificate; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\ORM\Mapping as ORM; use EducationBundle\Entity\Education; use LanguageBundle\Entity\Language; use PostBundle\Entity\Post; use ProfileBundle\Entity\Company; use RoleBundle\Entity\Role; use SkillBundle\Entity\Skill; use Symfony\Component\Security\Core\User\UserInterface; use Symfony\Component\Validator\Constraints as Assert; use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; /** * User * * @ORM\Table(name="users") * @ORM\Entity(repositoryClass="UserBundle\Repository\Entity\UserRepository") * @UniqueEntity("email") * @UniqueEntity("username") */ class User implements UserInterface { use BaseModel; /** * @var int * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** * @var string * * @ORM\Column(name="type", type="string", columnDefinition="ENUM('merchant', 'company', 'customer') ") */ private $type; /** * @ORM\Column(type="string", unique=true) * @Assert\NotBlank() */ private $username; /** * @var string * * @ORM\Column(type="string", length=255) * @Assert\NotBlank() */ private $email; /** * @var string * @ORM\Column(type="string", nullable=true) */ private $avatar = null; /** * @var string * @ORM\Column(type="string", nullable=true) */ private $cover = null; /** * @ORM\OneToMany(targetEntity="PostBundle\Entity\Post", mappedBy="user", orphanRemoval=true, cascade={"persist", "remove"}) */ private $posts; /** * @ORM\OneToMany(targetEntity="EducationBundle\Entity\Education" , mappedBy="user" , orphanRemoval=true, cascade={"persist", "remove"}) */ protected $educations; /** * @ORM\OneToMany(targetEntity="SkillBundle\Entity\SkillUser" , mappedBy="user" , orphanRemoval=true, cascade={"persist", "remove"}) */ protected $skills; /** * @ORM\OneToMany(targetEntity="LanguageBundle\Entity\LanguageUser" , mappedBy="user" , orphanRemoval=true, cascade={"persist", "remove"}) */ protected $languages; /** * @ORM\OneToMany(targetEntity="ResumeBundle\Entity\Resume" , mappedBy="user" , cascade={"all"}) */ protected $resumes; /** * @ORM\OneToMany(targetEntity="CertificateBundle\Entity\CertificateUser" , mappedBy="user" , orphanRemoval=true, cascade={"persist", "remove"}) */ protected $certificates; /** * @ORM\OneToOne(targetEntity="ProfileBundle\Entity\Company", mappedBy="user") */ protected $company; /** * @ORM\OneToOne(targetEntity="ProfileBundle\Entity\Customer", mappedBy="user") */ protected $customer; /** * @ORM\OneToOne(targetEntity="ProfileBundle\Entity\Merchant", mappedBy="user") */ protected $merchant; /** * @var string * @Assert\NotBlank() * @Assert\Length(min=4) * @ORM\Column(name="password", type="string", length=255) * */ private $password; /** * @ORM\ManyToMany(targetEntity="RoleBundle\Entity\Role", inversedBy="users", cascade={"persist"}) * @ORM\JoinTable(name="user_role", joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}, inverseJoinColumns={@ORM\JoinColumn(name="role_id", referencedColumnName="id")}) */ private $roles; /** * @ORM\ManyToOne(targetEntity="UserBundle\Entity\User", inversedBy="children") * @ORM\JoinColumn(name="parent_id", referencedColumnName="id", onDelete="SET NULL") */ protected $parent; /** * @ORM\OneToMany(targetEntity="UserBundle\Entity\User", mappedBy="parent", orphanRemoval=true, cascade={"persist", "remove"}) * */ protected $children; /** * @var array */ public static $fields = [ 'email', 'username', 'id', 'avatar', 'cover', 'type']; /** * User Entity constructor. */ public function __construct(/*EncoderFactoryInterface $encoderFactory*/) { //$this->encoderFactory = $encoderFactory; $this->posts = new ArrayCollection(); $this->skills = new ArrayCollection(); $this->languages = new ArrayCollection(); $this->certificates = new ArrayCollection(); $this->educations = new ArrayCollection(); $this->children = new ArrayCollection(); dump($this->children); die(); } /** * @param User $user * @return $this */ public function setParent(User $user) { $this->parent = $user; return $this; } /** * @return $this */ public function removeParent() { $this->parent = null; return $this; } /** * @param User $user * @return $this */ public function addChild(User $user) { if(!$this->children->contains($user)){ $this->children->add($user); } return $this; } /** * @param User $user * @return bool */ public function hasChild(User $user) { return $this->children->contains($user); } /** * @param User $user * @return bool */ public function isChildOf(User $user) { return $user->getChildren()->contains($this); } /** * @return ArrayCollection */ public function getChildren() { return $this->children; } /** * @param User $user * @return $this */ public function removeChild(User $user) { if($this->children->contains($user)){ $this->children->removeElement($user); } return $this; } /** * @param ArrayCollection $users * @return $this */ public function setChildren(ArrayCollection $users) { $this->children = $users; return $this; } /** * @return $this */ public function removeChildren() { $this->children->clear(); return $this; } /** * @param ArrayCollection $certificates * @return $this */ public function setCertificates(ArrayCollection $certificates) { $this->certificates = $certificates; return $this; } /** * @param Certificate $certificate * @return $this */ public function addCertificate(Certificate $certificate) { if(!$this->certificates->contains($certificate)) $this->certificates->add($certificate); return $this; } /** * @param Certificate $certificate * @return $this */ public function removeCertificate(Certificate $certificate) { if($this->certificates->contains($certificate)) $this->certificates->removeElement($certificate); return $this; } /** * @return $this */ public function removeCertificates() { $this->certificates->clear(); return $this; } /** * @param ArrayCollection $skills * @return $this */ public function setSkills(ArrayCollection $skills) { $this->skills = $skills; return $this; } /** * @param Skill $skill * @return $this */ public function addSkill(Skill $skill) { if(!$this->skills->contains($skill)) $this->skills->add($skill); return $this; } /** * @param Skill $skill * @return $this */ public function removeSkill(Skill $skill) { if($this->skills->contains($skill)) $this->skills->removeElement($skill); return $this; } /** * @return $this */ public function removeSkills() { $this->skills->clear(); return $this; } /** * @param ArrayCollection $languages * @return $this */ public function setLanguages(ArrayCollection $languages) { $this->languages = $languages; return $this; } /** * @param Language $language * @return $this */ public function addLanguage(Language $language) { if(!$this->languages->contains($language)) $this->languages->add($language); return $this; } /** * @param Language $language * @return $this */ public function removeLanguage(Language $language) { if($this->languages->contains($language)) $this->languages->removeElement($language); return $this; } /** * @return $this */ public function removeLanguages() { $this->languages->clear(); return $this; } /** * @param ArrayCollection $posts * @return $this */ public function setPosts(ArrayCollection $posts) { $this->posts = $posts; return $this; } /** * @param Post $post * @return $this */ public function addPost(Post $post) { $this->posts->add($post); return $this; } /** * @param Post $post * @return $this */ public function removePost(Post $post) { $this->posts->removeElement($post); return $this; } /** * @return $this */ public function removePosts() { $this->posts->clear(); return $this; } /** * @param ArrayCollection $educations * @return $this */ public function setEducations(ArrayCollection $educations) { $this->educations = $educations; return $this; } /** * @param Education $education * @return $this */ public function addEducation(Education $education) { $this->educations->add($education); return $this; } /** * @param Education $education * @return $this */ public function removeEducation(Education $education) { $this->educations->removeElement($education); return $this; } /** * @return $this */ public function removeEducations() { $this->educations->clear(); return $this; } /** * Get id * * @return integer */ public function getId() { return $this->id; } /** * @param integer $id * @return $this */ public function setId($id) { $this->id = $id; return $this; } /** * @return mixed */ public function getType() { return $this->type; } /** * @param mixed $type * @return $this */ public function setType($type) { $this->type = $type; return $this; } /** * Set email * * @param string $email * @return User */ public function setEmail($email) { $this->email = $email; return $this; } /** * @return string */ public function getEmail() { return $this->email; } /** * @param $username * @return $this */ public function setUsername($username) { $this->username = $username; return $this; } /** * @return mixed */ public function getUsername() { return $this->username; } /** * @return array */ public function getRoles() { return ['ROLE_USER', 'IS_AUTHENTICATED_ANONYMOUSLY']; } /** * @param $password * @return $this */ public function setPassword($password) { //$password =$this->encoderFactory->getEncoder($this)->encodePassword($password, $this->getSalt()); $this->password = $password; return $this; } /** * @return string */ public function getPassword() { return $this->password; } /** * */ public function getSalt() { return md5(sha1('somesalt')); } /** * */ public function eraseCredentials() { } /** * @param $cover * @return $this */ public function setCover($cover) { $this->cover = $cover; return $this; } /** * @return string */ public function getCover() { return $this->cover; } /** * @param $avatar * @return $this */ public function setAvatar($avatar) { $this->avatar = $avatar; return $this; } /** * @return string */ public function getAvatar() { return $this->avatar; } /** * @param Role $roles */ public function addRoles(Role $roles) { $this->roles[] = $roles; } /** * @return mixed */ public function getRoles2() { return $this->roles; } /** * @return array */ public function getRolesAsArray() { $rolesArray = []; foreach ($this->getRoles2() as $role) { $rolesArray[] = $role->getName(); } return $rolesArray; } /** * @return Company */ public function getCompany() { return $this->company; } /** * @param Company $company * @return $this */ public function setCompany(Company $company) { $this->company = $company; return $this; } }

这就是我要做的

$new_owner = $this->userRepository->findOneById($user_id, false); $children = $old_owner->getChildren(); $old_owner->removeChildren(); $new_owner->setChildren($children);

我得到错误提示:

参数1传递给 代理__CG __ \ UserBundle \ Entity \ User :: setChildren()必须是 Doctrine \ Common \ Collections \ ArrayCollection的实例, 给出了教义\ ORM \ PersistentCollection

Argument 1 passed to Proxies__CG__\UserBundle\Entity\User::setChildren() must be an instance of Doctrine\Common\Collections\ArrayCollection, instance of Doctrine\ORM\PersistentCollection given

我应该将setChildren方法中的类型提示更改为PersistentCollection吗? 还是我需要彻底改变自己的方法?

should I change my type hint in setChildren method to PersistentCollection ?? or I need to totally change my approach?

推荐答案

简短答案:

/** * @param Doctrine\Common\Collections\Collection $users * @return $this */ public function setChildren(Doctrine\Common\Collections\Collection $users) { $this->children = $users; return $this; }

说明:

如果您深入研究教义类,您将看到以下结构:

Explanation:

If you look deep into Doctrine Classes you will see the following structure:

数组集合是实现接口Collection的类:

Array collection is class that implements interface Collection:

class ArrayCollection implements Collection, Selectable

PersistentCollection是扩展AbstractLazyCollection的类:

PersistentCollection is class that extentds AbstractLazyCollection:

final class PersistentCollection extends AbstractLazyCollection implements Selectable

但是AbstractLazyCollection实现了Collection:

but AbstractLazyCollection implements Collection:

abstract class AbstractLazyCollection implements Collection

所以:

集合是接口,您应该在方法setChildren()中使用.

Collection is interface, that you should use in method setChildren().

这是因为使用延迟加载"(懒惰加载)机制,该机制允许加载的不是全部属性,而是仅加载所需的这些属性.

This is because of doctrine use lazy loading - mechanism that allow to load not all properties, but only these, that are needed.

类似的问题:

doctorManyToMany返回PersistentCollection而不是ArrayCollection

更多推荐

Symfony ArrayCollection与PersistentCollection

本文发布于:2023-10-10 22:57:55,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1480001.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:Symfony   ArrayCollection   PersistentCollection

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!