我有一个CakePHP 3.x的Course
, Subject
和Chapter
表的数据库。它们之间的关系如下:
Courses belongsToMany Subjects
Courses belongToMany Chapters
Subjects belongToMany Courses
Subjects hasMany Chapters
Subjects hasMany ChildSubjects
Subjects belongsTo ParentSubjects
Chapters belongToMany Courses
Chapters belongTo Subjects
我需要检索包含Subjects
, Subjects.ChildSubjects
, Subjects.Chapters
和Subjects.ChildSubjects.Chapters
具有相同课程的所有Courses
。我用mapReduce
开发了一个自定义查找器,它删除/取消设置/修改所有这些包含,也有相关的包含,这是不相同的过程。当单个课程通过课程查询返回时,它可以正常工作。但是,当它返回多个课程时,Subjects.ChildSubjects
和Subjects.ChildSubjects.Chapters
不能正确返回。
我从Cookbook中找到了原因,mapReduce()
方法是一种处理结果的方式,一旦它们从数据库中取出。这就是为什么当我删除/取消设置/修改一个课程的结果时,随后它也会受到另一个课程的影响。
在我的情况下,我如何解决/跳过那个问题?在我的情况下,formatResults
是最好的方法吗?
我终于解决了这个问题。 mapReduce()
方法是一种处理从数据库中获取结果的方法,而formatResults()
方法是处理从获取的结果中装饰结果集的方法。
当我将mapReduce
转换为formatResults
时,它可以正常工作。我的mapReduce
如下所示:
$mapper = function ($course, $key, $mapReduce) {
// start of mapper logic
... ... ... ... ... ...
... ... ... ... ... ...
... ... ... ... ... ...
// end of mapper logic
$mapReduce->emit($course, $key);
};
$query->mapReduce($mapper);
我把它改成formatResults
,如下所示:
//$query->mapReduce($mapper);
$query->formatResults(function ($courses) {
return $courses->map(function ($course) {
// start of mapper logic
... ... ... ... ... ...
... ... ... ... ... ...
... ... ... ... ... ...
// end of mapper logic
return $course;
});
});