CakePHP 3.x mapReduce不能用于查询多条记录



我有一个CakePHP 3.x的Course, SubjectChapter表的数据库。它们之间的关系如下:

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.ChaptersSubjects.ChildSubjects.Chapters具有相同课程的所有Courses。我用mapReduce开发了一个自定义查找器,它删除/取消设置/修改所有这些包含,也有相关的包含,这是不相同的过程。当单个课程通过课程查询返回时,它可以正常工作。但是,当它返回多个课程时,Subjects.ChildSubjectsSubjects.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;
    });
});

相关内容

  • 没有找到相关文章