编辑
忘记包含我正在使用的包:https://symfony.com/bundles/ZenstruckFoundryBundle/current/index.html
我正在尝试弄清楚如何将额外的数据传递给工厂,以便在某些自定义代码中保留后使用。
我有一个生成大学的工厂,然后将其插入数据库中,然后我需要使用课程工厂来分配我想要在 afterPersist 中执行的课程。
我尝试添加自己的方法来设置对象上的课程数组:
/**
* @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 中得到一个空数组(this->courses 是空的):
return $this->afterPersist(function(University $university){
foreach($this->courses as $type => $courseName){
CourseFactory::new()->create([
'name'=>$courseName,
'type'=>$type,
'uni'=>$university
]);
}
});
课程数组确实被分配了,但是当运行 create() 时它被清空了。
别忘了:
$this->afterPersist
Course
类文件中使用 University
实体类命名空间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']
]);
}
实际上,您可以通过其
uni
关系来处理持久课程,而无需使用 afterPersist
钩子。你可以像下面这样设置cascade={"persist"}
,然后将每门课程的uni
分配给大学里的$this
setCourses
方法
/**
* @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;
}
基于
$courses
属性已设置但未持久化的事实
很可能你忘记在学说关系注释中添加cascade={"persist"}
/**
* @ORM\OneToMany(... cascade={"persist"})
*/
private Collection|array $courses;
更多关于传递持久性/级联操作