ArrayCollection:以表格形式检索集合 [英] ArrayCollection: retrieve collection in a form

查看:80
本文介绍了ArrayCollection:以表格形式检索集合的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我用Symfony2创建了一个Web应用程序,其中用户与实体Mission具有数组关联ManytoMany.用户可以通过表单上载实体$ product,并且表单传递的数据之一是与用户相关联的任务.

I made a web application with Symfony2, in which a User has an array correlation ManytoMany with the entity Mission. The User can upload the entity $product through a form, and one of the data passed by the form is the mission associated to the user.

每个用户不止一个任务;因此,当他上传$ product对象时,他还应该能够选择自己喜欢的任务.

There are more than only one mission for every user; so, when he uploads a $product object, he should also be able to select the mission he prefers.

要上传文件,我将通过以下方式在控制器中使用表单:

To upload the file I use a form in a controller in the following way:

       $form = $this->createFormBuilder($product)
           ->add('mission', 'entity', array('required' => true, 'multiple' => false, 'class' => 'AcmeManagementBundle:Mission', 'query_builder' => function($repository) { return $repository->createQueryBuilder('c')->orderBy('c.id', 'ASC'); },))              
      //...
           ->add('save', 'submit')
           ->getForm(); 

它有效,但效果不佳:实际上,在此字段中,我可以选择存储的所有任务,而不仅仅是与用户相关联的任务.

It works, but not fine: indeed in this field I can select all the mission stored, and not only the ones associated with the user.

然后我尝试了:

       $form = $this->createFormBuilder($product)
           ->add('mission', 'collection', array('required' => true) )
      //...
           ->add('save', 'submit')
           ->getForm(); 

它可以工作,但仅显示一个任务,并且不允许用户选择首选任务.

It works but shows only one mission, and doesn't allow the user to select the preferred mission.

我也尝试过:

           ->add('mission', 'collection', array('required' => true) )

但是它告诉我:

Neither the property "missions" nor one of the methods "getMissions()", 
"isMissions()", "hasMissions()", "__get()" exist and have public access 
in class "Acme\GroundStationBundle\Entity\Product".

我应该如何更改控制器?

How I should change my controller??

我的产品实体是:

class Product
{
/**
 * @var \Doctrine\Common\Collections\ArrayCollection
 * 
 * @ORM\OneToMany(targetEntity="Acme\ManagementBundle\Entity\Mission", mappedBy="product")
 */
 protected $mission;

//...

 /**
  * Set mission
  *
  * @param string $mission
  * @return Product
  */
 public function setMission($mission)
 {
     $this->mission = $mission;

     return $this;
 }

 /**
  * Get mission
  *
  * @return string 
  */
 public function getMission()
 {
     return $this->mission;
 }
//...

更新---

我还将按照评论中的要求张贴我的产品和任务实体

I will post also my product and mission entity, as asked in the comments

这是我的用户实体:

 abstract class User extends BaseUser
 {

      /**
      * @var \Doctrine\Common\Collections\ArrayCollection
      * 
      * @ORM\ManyToMany(targetEntity="Acme\ManagementBundle\Entity\Mission", inversedBy="users", orphanRemoval=true)
      * @ORM\JoinTable(name="user_mission")
      */
     private $missions;    
     /**
      * Add missions
      *
      * @param \Acme\ManagementBundle\Entity\Mission $missions
      * @return User
      */
     public function addMission(\Acme\ManagementBundle\Entity\Mission $missions)
     {
         $this->missions[] = $missions;

         return $this;
     }
//...

我的任务实体:

<?php

namespace Acme\ManagementBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;

/**
 * @ORM\Entity
 */
class Mission {
    /** 
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     * @var integer
     */
    protected $id;
        /** 
     * @ORM\Column(type="string", length=60)
     * @var String
     */
    protected $name;
/**
 * @var \Doctrine\Common\Collections\ArrayCollection
 * 
 * @ORM\ManyToOne(targetEntity="Acme\GroundStationBundle\Entity\Product", inversedBy="mission")
 * @ORM\JoinColumn(name="productId", referencedColumnName= "id")
 */ 
private $product;
    /** 
     * @ORM\Column(type="string", length=600)
     * @var String
     */
    protected $description;
    /**
     * @var \Doctrine\Common\Collections\ArrayCollection
     *
     * @ORM\ManyToMany(targetEntity="Acme\ManagementBundle\Entity\User", mappedBy="missions", cascade={"all"}, orphanRemoval=true)
     */
    private $users;

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

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set name
     *
     * @param string $name
     * @return Mission
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Set description
     *
     * @param string $description
     * @return Mission
     */
    public function setDescription($description)
    {
        $this->description = $description;

        return $this;
    }

    /**
     * Get description
     *
     * @return string 
     */
    public function getDescription()
    {
        return $this->description;
    }

    /**
     * Add users
     *
     * @param \Acme\ManagementBundle\Entity\User $users
     * @return Mission
     */
    public function addUser(\Acme\ManagementBundle\Entity\User $users)
    {
        $this->users[] = $users;

        return $this;
    }

    /**
     * Remove users
     *
     * @param \Acme\ManagementBundle\Entity\User $users
     */
    public function removeUser(\Acme\ManagementBundle\Entity\User $users)
    {
        $this->users->removeElement($users);
    }

    /**
     * Get users
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
    public function getUsers()
    {
        return $this->users;
    }
    public function __toString()
    {
        return $this->name;
    }
/**
 * Set product
 *
 * @param \Acme\GroundStationBundle\Entity\Product $product
 * @return Mission
 */
public function setProduct(\Acme\GroundStationBundle\Entity\Product $product = null)
{
    $this->product = $product;

    return $this;
}

/**
 * Get product
 *
 * @return \Acme\GroundStationBundle\Entity\Product 
 */
public function getProduct()
{
    return $this->product;
}
}

推荐答案

请查看我对您的代码所做的更改.

Please take a look at my changes to your code.

当您定义一个(产品)对多个(任务)关系时,您会遇到以下情况:

When you define One(product)ToMany(missions) relation you have situation like this:

1..产品具有许多任务,并且必须具有任务的ArrayCollection,您可以添加,删除或获取所有任务.

1. Product has many missions and must have an ArrayCollection of missions which you can add, remove or get all.

class Product
{
/**
 * @var \Doctrine\Common\Collections\ArrayCollection
 * 
 * @ORM\OneToMany(targetEntity="Acme\ManagementBundle\Entity\Mission", mappedBy="product")
 */
// RENAME this attribute to plural. Product HAS MANY missions
// Than naming convention is "human readable" addMission and removeMission from collection but getMissions
protected $missions;
//...

//
// remove those functions:
public function setMission($mission)
//...
public function getMission()
//...

//
// add those functions:
public function __construct(){
        $this->missions = new ArrayCollection();
    }

public function addMission( Acme\ManagementBundle\Entity\Mission $mission )
{
    $this->missions[] = $mission;

    return $this;
}

public function removeMission( Acme\ManagementBundle\Entity\Mission $mission )
{
    $this->missions->removeElement( $mission );

    return $this;
}

public function getMissions()
{
    return $this->missions;
}
//...

2..许多MissionS属于一种产品.仅更改注释

2. Many MissionS are owned by one product. Change only annotation

class Mission {
//... 
// RENAME inversedBy to missions
/**
 * @var \Doctrine\Common\Collections\ArrayCollection
 * 
 * @ORM\ManyToOne(targetEntity="Acme\GroundStationBundle\Entity\Product", inversedBy="missions")
 * @ORM\JoinColumn(name="productId", referencedColumnName= "id")
 */ 
private $product;

编辑开始

3.相反-许多产品属于一项任务 如果存在您在注释中提到的情况,那么您的注释是错误的.查看此修复程序:

3. Opposite - MANY products Belongs to one Mission If there is situation like you mentioned in comment, then your Annotations are wrong. Look at this fix:

class Product
{
// ...
/**
 * @var \Doctrine\Common\Collections\ArrayCollection
 * 
 * @ORM\ManyToOne(targetEntity="Acme\GroundStationBundle\Entity\Mission", inversedBy="products")
 * @ORM\JoinColumn(name="missionId", referencedColumnName= "id")
 */
protected $mission;

// ...

// roll back this functions:
public function setMission($mission)
public function getMission()

// remove those functions
public function __construct(){
public function addMission( Acme\ManagementBundle\Entity\Mission $mission )
public function removeMission( Acme\ManagementBundle\Entity\Mission $mission )
public function getMissions()
//...



class Mission {
// ...
/**
 * @var \Doctrine\Common\Collections\ArrayCollection
 * 
 * @ORM\OneToMany(targetEntity="Acme\ManagementBundle\Entity\Product", mappedBy="mission")
 */ 
private $products;

// ...

//
// remove those functions:
public function setProduct($product)
public function getProduct()
//...

//
// add those functions:
public function __construct(){
        $this->products = new ArrayCollection();
    }

public function addProduct( Acme\ManagementBundle\Entity\Product $product )
{
    $this->products[] = $product;

    return $this;
}

public function removeProduct( Acme\ManagementBundle\Entity\Product $product )
{
    $this->products->removeElement( $product );

    return $this;
}

public function geProducts()
{
    return $this->products;
}
//...

编辑结束

3.之后,请记住:

$ php app/console doctrine:generate:entities AcmeGroundStationBundle:Product
$ php app/console doctrine:generate:entities AcmeGroundStationBundle:Mission
$ php app/console doctrine:schema:update --force

祝你好运!

这篇关于ArrayCollection:以表格形式检索集合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆