php – 具有属性的一对多对一形式与Symfony 3 / Doctrine
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了php – 具有属性的一对多对一形式与Symfony 3 / Doctrine,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4888字,纯文字阅读大概需要7分钟。
内容图文
![php – 具有属性的一对多对一形式与Symfony 3 / Doctrine](/upload/InfoBanner/zyjiaocheng/810/4e838978861c455b91f7b1dd238d0019.jpg)
这是问题所在:
我有一个有3个班级的模型
>人
> person_job
>工作
一个人可以有多个工作,任何工作人员关系都可以有“date_start”属性,“date_end”和“comment”.所以我用一个包含这些属性的jointable(person_job)构建了这个模型,并在2个manyToOne属性上创建了一个名为person和job的关系(用doctrine注释生成)
人物属性如下:
/**
* @var string
* @ORM\Column(name="name",type="string",length=255,nullable=false)
*/
private $name;
/**
* @var string
* @ORM\Column(name="firstname",type="string",length=255,nullable=true)
*/
private $firstname;
/**
* @var bool
* @ORM\Column(name="active", type="boolean")
*/
private $active;
作业属性如下所示:
/**
* @var string
* @ORM\Column(name="name",type="string",length=255,nullable=false)
*/
private $name;
person_job看起来像这样:
/**
* @ORM\ManyToOne(targetEntity="...\Person")
* @ORM\JoinColumn(nullable=false)
*/
private $person;
/**
* @ORM\ManyToOne(targetEntity="...\Job")
* @ORM\JoinColumn(nullable=false)
*/
private $job;
/**
* @var string
* @ORM\Column(name="comment",type="string",length=255,nullable=true)
*/
private $comment;
/**
* @var \DateTime
* @ORM\Column(name="startdate",type="datetime")
*/
private $datestart;
/**
* @var \DateTime
* @ORM\Column(name="enddate",type="datetime")
*/
private $dateend;
现在我想为我的“人”构建一个表单,我可以在列表中选择作业,并添加(如果需要)date_start,date_end或与此作业相关的注释.我的FormBuilder对于“Person”看起来像这样:
$builder
->add('name')
->add('firstname')
->add('jobs',Job::class,array('label'=>'Job'));
这失败了.我的Person类没有“jobs”属性..所以,我怎样才能实现这样的东西呢?我是否必须添加一个具有oneToMany关系的jobs属性,并使用“mappedBy”声明?
学说中的这些关系仍然让我感到困惑,我是symfony的新手,我在互联网上看了一下却找不到合适的解决方案/例子……
感谢您的阅读/帮助
解决方法:
你遇到了Symfony形式最难的问题之一.幸运的是,有一些很好的文档.让我总结一下重要的步骤.
你是对的:如果你想从Person的角度来操纵这种关系,那么实体Person需要知道它与PersonJob的关系.所以你需要添加一个属性:
// src/AppBundle/Entity/Person.php
/**
* @ORM\OneToMany(targetEntity="PersonJob", mappedBy="person")
*/
private $personJobs;
public function __construct()
{
$this->personJobs = new \Doctrine\Common\Collections\ArrayCollection();
}
然后你将拥有表单类型
// src/AppBundle/Form/PersonType.php
$builder
->add('name')
->add('firstname')
->add('personJobs', CollectionType::class, array(
'entry_type' => PersonJobType::class,
'allow_add' => true,
)
;
请注意personJobs字段的类型.由于一个人可以拥有许多PersonJobs,因此您需要一个可以处理集合的表单类型.这是内置CollectionType的目的(查看its documentation!).您还需要表单类型PersonJobType,以便CollectionType知道如何构建子表单:
class PersonJobType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('comment')
->add('datestart', DateTimeType::class)
->add('dateend', DateTimeType::class)
->add('job') // requires Job::__toString() to be defined!
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\PersonJob'
));
}
}
出于调试目的,将控制器更改为
public function testAction()
{
$person = new Person();
$form = $this->createForm(PersonType::class, $person);
$form->add('submit', SubmitType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
print '<pre>';
var_dump($form->getData());
die();
}
return $this->render('default/index.html.twig', [
'form' => $form->createView(),
]);
}
现在继续复制&粘贴Adding and Removing Items的Twig和Javascript代码(您必须进行一些小的更改,例如用form.personJobs替换form.emails).
表格
表格看起来像
只是带有“添加另一个PersonJob”链接的Person表单:
添加PersonJob:
添加anothing PersonJob:
收到的数据
提交表单并查看var_dump的输出:
object(AppBundle\Entity\Person)#247 (5) {
["id":"AppBundle\Entity\Person":private]=>
NULL
["name":"AppBundle\Entity\Person":private]=>
string(12) "Charles Dude"
["firstName":"AppBundle\Entity\Person":private]=>
string(7) "Charles"
["active":"AppBundle\Entity\Person":private]=>
bool(true)
["personJobs":"AppBundle\Entity\Person":private]=>
object(Doctrine\Common\Collections\ArrayCollection)#248 (1) {
["elements":"Doctrine\Common\Collections\ArrayCollection":private]=>
array(2) {
[0]=>
object(AppBundle\Entity\PersonJob)#962 (6) {
["id":"AppBundle\Entity\PersonJob":private]=>
NULL
["comment":"AppBundle\Entity\PersonJob":private]=>
string(19) "Something important"
["datestart":"AppBundle\Entity\PersonJob":private]=>
object(DateTime)#1088 (3) { … }
["dateend": …] => …
["person":"AppBundle\Entity\PersonJob":private]=>
NULL
["job":"AppBundle\Entity\PersonJob":private]=>
object(AppBundle\Entity\Job)#1171 (2) {
["id":"AppBundle\Entity\Job":private]=>
int(2)
["name":"AppBundle\Entity\Job":private]=>
string(5) "Job 2"
}
}
[1]=> …
}
}
还有两件事要做:
>将嵌套的PersonJob实体的person属性正确设置为新的(但尚未保留)Person.
>通过在它们上面调用$em-> persist(…)告诉Doctrine有关新PersonJob实体的信息.
相关文件:
> CollectionType Field
> How to Embed a Collection of Forms
内容总结
以上是互联网集市为您收集整理的php – 具有属性的一对多对一形式与Symfony 3 / Doctrine全部内容,希望文章能够帮你解决php – 具有属性的一对多对一形式与Symfony 3 / Doctrine所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。