- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 Symfony2 制作了一个 Web 应用程序,其中用户与实体 Mission 具有数组关联 ManytoMany。用户可以通过表单上传实体$product,表单传递的数据之一是与用户关联的任务。
每个用户都有多个任务;因此,当他上传 $product 对象时,他还应该能够选择他喜欢的任务。
为了上传文件,我通过以下方式在 Controller 中使用表单:
$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();
它可以工作,但不太好:实际上,在这个字段中,我可以选择存储的所有任务,而不仅仅是与用户关联的任务。
然后我尝试了:
$form = $this->createFormBuilder($product)
->add('mission', 'collection', array('required' => true) )
//...
->add('save', 'submit')
->getForm();
它可以工作,但只显示一个任务,并且不允许用户选择首选任务。
我也尝试过:
->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".
我应该如何更改我的 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;
}
//...
更新 ---
按照评论中的要求,我还将发布我的产品和任务实体
这是我的用户实体:
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;
}
}
最佳答案
请查看我对您的代码所做的更改。
当您定义 One(product)ToMany(missions) 关系时,您会遇到如下情况:
1. 产品有许多任务,并且必须有一个任务的 ArrayCollection,您可以添加、删除或获取所有任务。
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 都属于一种产品。仅更改注释
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. 相反 - 许多产品属于一个使命如果存在像您在评论中提到的情况,那么您的注释是错误的。看看这个修复:
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
祝你好运!
关于php - ArrayCollection:以表单形式检索集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21446285/
我扩展了 ArrayCollection 类以添加推送方法 package com.cargo.collections { import mx.collections.ArrayCollect
我使用 Symfony2 制作了一个 Web 应用程序,其中用户与实体 Mission 具有数组关联 ManytoMany。用户可以通过表单上传实体$product,表单传递的数据之一是与用户关联的任
我用 Symfony2 制作了一个 Web 应用程序,其中一个 User 有一个数组关联 ManytoMany 与实体 Mission。用户可以通过表单上传实体 $product,表单传递的数据之一是
我在使用 tagsinput 的表单上使用标签: 此插件以单个文本字段结束,其中包含以逗号分隔的标签(例如:tag1,tag2,...) 这些标签目前在非映射表单字段上进行管理: $build
我正在寻找一种为 ODM ArrayCollection 关联数组键的方法。 实体具有以下映射: /** * $fields * * The entities fields * * @ODM
我正试图在我的包中实现一些可重用的翻译。这些是我的代码的相关部分: TranslatorKeys.php: ... /** * @var \ArrayCollection * * @ORM\On
好的,我有一个 User 实体如下 urls = new \Doctrine\Common\Collections\ArrayCollection(); } public functi
我想在 Flex 中迭代 ArrayCollection,同时可以添加和删除项目。 因为我没有找到一种方法来使用像 Java 中那样的“经典”迭代器来完成这项工作。我试过游标。但它并没有真正按照我想要
如果我有一个 ArrayCollection 类型的变量,如何检查集合中是否存在特定名称的键(包括嵌套)。如果确实如此,我如何获取和更改该值? 最佳答案 我猜你正在谈论 Doctrines Array
如果我有一个 ArrayCollection 类型的变量,如何检查集合中是否存在特定名称的键(包括嵌套)。如果确实如此,我如何获取和更改该值? 最佳答案 我猜你正在谈论 Doctrines Array
在对我的数据提供者(数组集合)应用数字排序后,我无法通过 tilelist 重新排序项目。我需要从 arrayCollection 中删除排序吗?如果是这样,是否只是设置 collection.sor
我想创建一个表单来编辑我的用户。与 ManyToMany 关联的用户和角色。在 UserUsers 实体中,我有一个 $roles 变量,它是 ArrayCollection: public func
通常您可以使用以下方法检查变量是否是类的实例: $foo instanceof bar 但是对于 ArrayObjects(属于 Symfony 2),这似乎不起作用 get_class($foo)
即使对象被正确更新,数据似乎也没有持久化,我不明白为什么。 这是我的实体: Article.php /** * @var AttributeInArticle * * @ORM\OneToMan
public function getInvoiceItemsByType($type) { return $this->invoiceItems->filter(function ($inv
考虑以下问题: 我在 Article 和 Author 之间有一个多对一 关联。 class Author{ /** * ... *@var ArrayCollection_of_Ar
我正在尝试按特定字段对 ArrayCollection 进行排序。 ArrayCollection 是一个类(class)数组。在 Course 实体中有一个名为 isLive 的方法,它返回一个 b
我有一些这样的 XML 结构: var struct:XML = ; 我知道我可以通过“id”访问子节点,方式如下: var stuff:Object = struct.(hasO
我正在使用 JMS 序列化程序。当 JsonSerializer 与 Doctrine ArrayCollection 类型一起工作时,它给了我不正确的数组格式。指定的结果应遵循格式 [ {}, {}
在设置了 filterFunction 的 ArrayCollection 上调用 getItemIndex 时遇到了一些问题。 我做了类似 myAC.removeItemAt(myAC.getIte
我是一名优秀的程序员,十分优秀!