编辑
忘记包括我正在使用的包裹:https://symfony.com/bundles/ZenstruckFoundryBundle/current/index.html
我正试图弄清楚如何将额外的数据传递给工厂,以便在一些自定义代码中使用。
我有一个生成大学的工厂,在它被插入数据库后,我需要使用课程工厂来分配我想在Persist之后完成的课程。
我尝试添加我自己的方法来设置对象上的课程数组:
/**
* @param array $courses
* @return $this
*/
public function setCourses(array $courses) : self
{
$this->courses = $courses;
return $this;
}
然后这样称呼它:
foreach($this->universities as $university){
UniversityFactory::new()->setCourses($university['courses'])->create([
'name'=>$university['name'],
'slug'=>$university['slug']
]);
}
然而,我在afterPersists中得到了一个空数组(这个->课程是空的(:
return $this->afterPersist(function(University $university){
foreach($this->courses as $type => $courseName){
CourseFactory::new()->create([
'name'=>$courseName,
'type'=>$type,
'uni'=>$university
]);
}
});
课程数组确实被分配了,但当运行create((时,它会被清空。
编辑2
别忘了:
- 删除
$this->afterPersist
的代码 - 在
University
类文件中使用Course
实体类命名空间 - 更新传递给
setCourses
的内容:
foreach($this->universities as $university){
UniversityFactory::new()->setCourses(
array_map(function ($type,$courseName){
return (new Course())->setType($type)->setName($courseName);
}, array_keys($university['courses']), array_values($university['courses']))
)->create([
'name'=>$university['name'],
'slug'=>$university['slug']
]);
}
编辑1
实际上,您可以使用它们的uni
关系来处理持久化课程,而无需使用afterPersist
挂钩。你可以按下面的方式设置cascade={"persist"}
,并将每门课程的uni
分配给大学setCourses
方法中的$this
/**
* @param Course[] $courses
* @return $this
*/
public function setCourses(array $courses) : self
{
$this->courses = [];
foreach($courses as $course){
if (!$this->courses->contains($course)) {
$this->courses[] = $course;
$course->setUni($this);
}
}
return $this;
}
原始Ansewar
基于$courses
属性已设置但未持久化的事实你很可能忘记在条令关系注释中添加cascade={"persist"}
/**
* @ORMOneToMany(... cascade={"persist"})
*/
private Collection|array $courses;
有关传递持久性/级联操作的更多信息