0

子クラスのポリモーフィックな親を熱心にロードできません。include ステートメントは違いがないようです。

子クラス:

@BelongsToPolymorphic(
    parents = {ParentRequest.class},
    typeLabels  = {"parent_request"})
public class Child extends Model {
}

親クラス:

public class ParentRequest extends Model {

}

積極的に子 + 親を返す必要があるクエリ:

List<Child> children = Child.where("... limit 500").include(ParentRequest.class);

children.size(); //this gives me 500
children.cachedParents.size(); //this gives me 0;

最終的に、次の操作を高速化しようとしています。

for (Child child : children) {
     ParentRequest pr = child.parent();
     // lots of pr.getString("parent_field");
     ...
 }

これらの操作をベンチに置いたところ、 Child.where() メソッドで .include(ParentRequest.class) が使用されているかどうかに関係なく、上記の操作は約 67 ミリ秒かかるようです。

洞察や助けをいただければ幸いです。

注: 子には親が 1 つしかないことは承知しています。近い将来、それはいくつかになるでしょう。

編集: クエリを反転すると、いくつかの理由ではるかに高速な結果が得られました。つまり、Children を探して ParentRequest を含めるよりも、ParentRequest を検索して Child を含めた方が、操作ははるかに高速でした。結果で子テーブルをparent_requestテーブルに結合するためにfindBySqlを具体的に実行したことに注意してください。以下に、クエリの詳細を残しました。

List<ParentRequest> parents = ParentRequest.findBySQL("SELECT child.*, parent_requests.* " +
                "FROM child JOIN parent_requests ON child.parent_id=parent_requests.id WHERE " +
                "RAND()<=? AND (child.metersToA BETWEEN ? AND ?) " +
                        " AND (child.metersToB BETWEEN ? AND ?) limit ?",
                decimation_value,
                minDistanceToA, maxDistanceToA ,
                minDistanceToB, maxDistanceToB,
                MAX_POINTS).include(Child.class);
4

1 に答える 1