2016-09-26 5 views
0

У меня есть база данных с Course, Subject и Chapter таблица для CakePHP 3.x. Соотношение между ними следующим образом:CakePHP 3.x mapReduce не работает для запроса нескольких записей

Courses  belongsToMany Subjects 
Courses  belongToMany Chapters 

Subjects  belongToMany Courses 
Subjects  hasMany  Chapters 
Subjects  hasMany  ChildSubjects 
Subjects  belongsTo  ParentSubjects 

Chapters  belongToMany Courses 
Chapters  belongTo  Subjects 

Мне нужно, чтобы получить все Courses с содержащий Subjects, Subjects.ChildSubjects, Subjects.Chapters и Subjects.ChildSubjects.Chapters, которые имеют один и тот же курс. Я разработал пользовательский поиск с mapReduce, который удаляет/отменяет/изменяет все содержащиеся, а также содержит ассоциированные, которые не являются тем же курсом. Это отлично работает, когда один курс возвращается по курсу. Но, когда он вернул несколько курсов, тогда Subjects.ChildSubjects и Subjects.ChildSubjects.Chapters не возвращены должным образом.

Я нашел причину из Cookbook, mapReduce() метод - это способ обработки результатов после их получения из базы данных. Вот почему, когда я удаляю/отменю/изменяю результат для одного курса, он позже будет затронут другим курсом.

Как я могу решить/пропустить эту проблему в моем случае? formatResults будет лучшим подходом в моем случае?

ответ

1

Я решил проблему наконец. 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; 
    }); 
}); 
Смежные вопросы