我使用Symfony2创建了一个Web应用程序,注册用户可以通过表单上传文件。 通过该文件,用户还可以保存有关该文件的信息,该信息表示与其相关的“任务”。
现在我将“任务信息”设置为“用户对象”;因此,当用户存储文件时,控制器检索有关任务的信息并将其与文件相关联。
用户实体是:
class UserOperator extends User
{
protected $id;
protected $name;
private $mission;
带有注释,设置器和getter。
我存储文件的createAction是:
public function createAction(Request $request)
{
$product = new Product();
// ...
$product->setMission($this->getUser()->getMission());
$form = $this->createFormBuilder($product)
->add('name', 'text')
// ...
->add('save', 'submit')
// ...
->getForm();
问题在于,如果我想更改名称或删除或修改任务,我必须更改与该任务相关的所有用户。我更喜欢创建一个“任务实体”,其中存储所有并且仅存储参与该任务的用户;当用户存储文件时,控制器向数据库查询可用的任务,并让用户仅选择与他相关的任务,并将文件与所选任务一起存储。
有可能吗?我该怎么办?
回顾一下,我的“使命实体”应该只能理解
$id
$name
$description (a textarea)
$userlist
现在我有一个名为user的实体和一个名为$ product的实体。进入实体$ user存储一个称为“任务”的问题:当用户上传具有特定表单的文件时,控制器还保存与用户相关联的任务。现在我没有“任务实体”,我不知道怎么做,如何将许多用户与任务实体联系起来。
我希望很清楚。
提前谢谢
答案 0 :(得分:2)
好的,我会告诉你。我想我知道你想做什么。
首先,让我们制作任务实体:
namespace YOURNAMESPACE;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
/**
* @ORM\Entity
*/
class Mission implements MissionInterface {
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
* @var integer
*/
protected $id;
/**
* @ORM\Column(type="string", length=60)
* @var String
*/
protected $name;
/**
* @ORM\ManyToMany(targetEntity="YOURNAMESPACE\User", inversedBy="users")
*/
protected $users;
public function __construct(){
$this -> users = new ArrayCollection();
}
public function setUsers(Collection $users){
$this -> users = $users;
return $this;
}
public function addUser(UserInterface $user){
$this -> users -> add($user);
return $this;
}
public function getUsers(){
return $this -> users;
}
// setter + getter
}
namespace YOURNAMESPACE;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
/**
* @ORM\Entity
*/
class User implements UserInterface {
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
* @var integer
*/
protected $id;
/**
* @ORM\Column(type="string", length=60)
* @var String
*/
protected $name;
/**
* @ORM\ManyToMany(targetEntity="YOURNAMESPACE\Mission", mappedBy="users")
*/
protected $missions;
public function __construct(){
$this -> missions = new ArrayCollection();
}
public function setMissions(Collection $missions){
$this -> missions = $missions;
return $this;
}
public function addMission(MissionInterface $mission){
$this -> missions -> add($mission);
return $this;
}
public function getMissions(){
return $this -> missions;
}
// setter + getter
}
注意:返回$ this;没有必要,但可以用来结合像$ this这样的调用 - > set1() - > SET2()。
编辑:你想要接口的代码。我认为这是基本的东西,但我讨厌未完成的解决方案,所以这里是接口:
namespace YOURNAMESPACE;
use SOMENAMESPACE\UserInterface;
use Doctrine\Common\Collections\Collection;
interface MissionInterface {
/**
* make some documentation please
*/
public function getUsers();
/**
* make some documentation please
*/
public function addUser(UserInterface $user);
/**
* make some documentation please
*/
public function setUsers(Collection $users);
// + other functions
}
您还应该创建自己的UserInterface,扩展Symfony的UserInterface并将新方法添加到它。
现在您的用户与任务相关联。每个用户可以拥有多个任务,每个任务可以拥有多个用户。
答案 1 :(得分:0)
我真的不明白你的问题。
您有一个名为user
每个文件只有一个任务。这种关联是必要的。
每个任务都有多个用户
与任务相关联的每个用户都可以编辑,更新,删除此任务
现在您想要更改任务的某些属性,例如名称。通常它不会有任何问题。 那么为什么你必须“改变与该任务相关的所有用户”?这是您的代码的要求还是后果?