Class ReleasesType:
$builder
->add('doid', 'text')
->add('dourl', 'text')
->add('artists', 'entity', array(
'class' => 'MReleaseCoreBundle:Artists',
'property' => 'name',
'expanded' => true ,
'multiple' => true
));
与他们一对多的联系:
班级'艺术家':
/**
* @ORM\OneToMany(targetEntity="ReleasesArtists" , mappedBy="artists" , cascade={"all"})
* */
private $da;
public function __construct() {
$this->da = new \Doctrine\Common\Collections\ArrayCollection();
}
班级'发布艺术家':
/**
* @ORM\ManyToOne(targetEntity="Releases", inversedBy="da")
* @ORM\JoinColumn(name="releases_id", referencedColumnName="id")
* */
private $releases;
/**
* @ORM\ManyToOne(targetEntity="Artists", inversedBy="da")
* @ORM\JoinColumn(name="artists_id", referencedColumnName="id")
* */
private $artists;
当然,实体'发布':
/**
* @ORM\OneToMany(targetEntity="ReleasesArtists" , mappedBy="releases", cascade={"all"} , orphanRemoval=true)
*/
private $da;
public function getArtists() {
$artists = new ArrayCollection();
foreach($this->da as $p) {
$artists[] = $p->getArtists()->getName();
}
return $artists;
}
public function addDa($da) {
$this->da[] = $da;
}
public function setArtists($artists) {
foreach($artists as $p) {
$po = new \MRelease\CoreBundle\Entity\ReleasesArtists();
$po->setReleases($this);
$po->setArtists($p);
$this->addDa($po);
}
}
连接正常,所有输出。但不“检查”。可能是什么问题? 谢谢!
答案 0 :(得分:0)
在构建和输出表单的控制器中,你必须做这样的事情
public function myFooAction(Request $request, $releasesId)
{
$repo = $this->getDoctrine()->getManager()->getRepository('YourBundleName:Releases');
$releasesObject = $repo->findOneById($releasesId);
$form = $this->createForm(new ReleasesType(), $releasesObject);
return $this->render('YourBundle::TemplateToRender, array('form'=>$form);
}
这里发生了什么,为什么有效?
我做了一些假设,因为你没有提供任何控制器代码。首先,我假设您有myFooAction()
之类的操作,您可以在其中执行表单操作,我想,您也可以将来自数据库的加载对象的id
传递给此操作并将其绑定到您的操作形式 - 如果我理解你的问题。
因此,第一行是针对此对象的检索存储库。一旦你有了回购,你可以获取你的对象(第二行)。在第三行,我使用Symfony2表单的工具和“连接”对象到他的表单类型:这样,包含在此对象中的所有值都将报告到您的表单中(因此复选框将具有正确的值)。最后一行是渲染形式。
显然,你的行动逻辑可能不同,但这里表达的概念可以在任何地方以“不同”的实施方式复制。