2016-09-26 20 views
0

私はCourse,SubjectChapterの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 

を私はSubjectsSubjects.ChildSubjectsSubjects.Chaptersと同じコースを持つSubjects.ChildSubjects.Chaptersを含むと、すべてのCoursesを取得する必要があります。私はmapReduceのカスタムファインダーを開発しました。これは、含まれているすべてのものを削除/設定解除/変更し、同じものではない関連するものも含みます。 1つのコースがコースのクエリによって戻ってくるときはうまくいく。しかし、複数のコースを返すと、Subjects.ChildSubjectsSubjects.ChildSubjects.Chaptersが正しく返されません。

Cookbookからの理由を見つけたので、mapReduce()メソッドはデータベースからフェッチされた結果を処理する方法です。そのため、あるコースの結果を削除/設定解除/変更すると、後で別のコースの影響を受けます。

私の場合、どのように問題を解決することができますか?私の場合、formatResultsは最善の方法でしょうか?

答えて

1

最後に問題を解決しました。 mapReduce()メソッドは、データベースからフェッチされた結果を処理する方法ですが、formatResults()メソッドはフェッチされた結果からデコレートされた結果セットを処理する方法です。

mapReduceformatResultsに変換したときに問題なく動作します。

//$query->mapReduce($mapper); 

$query->formatResults(function ($courses) { 
    return $courses->map(function ($course) { 
     // start of mapper logic 
     ... ... ... ... ... ... 
     ... ... ... ... ... ... 
     ... ... ... ... ... ... 
     // end of mapper logic 

     return $course; 
    }); 
}); 
:私は以下のように formatResultsにそれを変更し

$mapper = function ($course, $key, $mapReduce) { 
    // start of mapper logic 
    ... ... ... ... ... ... 
    ... ... ... ... ... ... 
    ... ... ... ... ... ... 
    // end of mapper logic 

    $mapReduce->emit($course, $key); 
}; 

$query->mapReduce($mapper); 

:私mapReduceは以下の通りのようでした

関連する問題