関連のお問い合わせ
DB :: enableQueryLog()。 $フィルタ = []; $フィルタ[ ' Course_IDに' ] = $ Course_IDに。 // [ 'と'] $フィルター[ 'ユーザー'] = []; CourseUser ::アイテム($フィルター); $クエリ = DB :: getQueryLog(); 返す自己::成功($クエリ);
SQLを実行して印刷
{ " クエリ":" ここで、(` wm_course_user`.`is_delete` =?) `wm_course_user`から集合体としてカウント(*)を選択" 、 " バインディング" :[ 0 ]、 " 時間":0.28 }、 { " クエリ":" ` wm_course_user`.`user_id`、 `wm_course_user`(?` wm_course_user`.`is_delete` =)から`wm_course_user`.`course_id`、` wm_course_user`.`created_at`、 `wm_course_user`.`id`を選択`wm_course_user`.`id` DESC制限20によって順序がオフセット0 "、 " バインディング" :[ 0 ]、 " 時間":0.28 }
私は、それに関連付けられたデータへのアクセスを見つけることができませんSQLクエリを実行しません、これは遅延ロードされ。今私は、クエリを見て、それに関連付けられたデータを使用するつもりです
DB :: enableQueryLog()。 $フィルタ = []; $フィルタ[ ' Course_IDに' ] = $ Course_IDに。 // [ 'と'] $フィルター[ 'ユーザー'] = []; $アイテム= CourseUser ::アイテム($フィルター); foreachの($アイテムとして$値){ のvar_dump($値 - > USER-> 名); } $クエリ = DB :: getQueryLog()。 返す自己::成功($クエリ);
SQLの印刷実行以下の通りです。
{ " クエリ":" ここで、(` wm_course_user`.`is_delete` =?) `wm_course_user`から集合体としてカウント(*)を選択" 、 " バインディング" :[ 0 ]、 " 時間":0.25 }、 { " クエリ":" ` wm_course_user`.`user_id`、 `wm_course_user`(?` wm_course_user`.`is_delete` =)から`wm_course_user`.`course_id`、` wm_course_user`.`created_at`、 `wm_course_user`.`id`を選択`wm_course_user`.`id` DESC制限20によって順序がオフセット0 "、 `id` =?リミット1 " 、 " バインディング" [ 2 ]、 " 時間":0.37 }
各団体は、いわゆるN + 1つの問題でクエリをデータベースクエリが表示されます。
DB :: enableQueryLog()。 $フィルタ = []; $フィルタ[ ' Course_IDに' ] = $ Course_IDに。 // [ 'と'] $フィルター[ 'ユーザー'] = []; $アイテム= CourseUser ::アイテム($フィルター); foreachの($アイテムとして$値){ 場合($値- > USER_ID == 2 ){ のvar_dump($値 - > USER-> 名); } } $クエリ = DB :: getQueryLog()。 返す自己::成功($クエリ);
文を実行
{ " クエリ":" ここで、(` wm_course_user`.`is_delete` =?) `wm_course_user`から集合体としてカウント(*)を選択" 、 " バインディング" :[ 0 ]、 " 時間":0.28 }、 { " クエリ":" ` wm_course_user`.`user_id`、 `wm_course_user`(?` wm_course_user`.`is_delete` =)から`wm_course_user`.`course_id`、` wm_course_user`.`created_at`、 `wm_course_user`.`id`を選択`wm_course_user`.`id` DESC制限20によって順序がオフセット0 "、 " バインディング" :[ 0 ]、 " 時間":0.25 }、 { " クエリ":" wm_user`ここで` wm_user`.`id` =リミット1 'SELECT * FROM?" 、 " バインディング" [ 2 ]、 " 時間」:0.47 }
どのようにN + 1問題を回避するには?クエリが事前にロードされて使用してください
DB :: enableQueryLog()。
$フィルタ= [];
$フィルタ[ 'Course_IDに'] = $ Course_IDに。
[ 'と'] $フィルター[ 'ユーザー'] = []; CourseUser ::アイテム($フィルター); $クエリ= DB :: getQueryLog(); 自己::成功($クエリ)を返します。
次のようにプリントアウト実行するSQL
{
"クエリ": "ここで、(` wm_course_user`.`is_delete` =?) `wm_course_user`から集合体としてカウント(*)を選択" 、
"バインディング" :[
0 ]、 "時間":0.28 }、 { "クエリ" :「`wm_course_user`.`user_id`、` wm_course_user`(? `wm_course_user`.`is_delete` =)から` wm_course_user`.`course_id`、 `wm_course_user`.`created_at`、` wm_course_user`.`id`を選択wm_course_user`.`id`のDESC制限`によって注文20が0"オフセット"バインディング" [0 ]、 "時間":0.31 }、{ "クエリ":「` wm_user`場合`wm_user`.`id SELECT * FROM `(2、1643)」、 "バインディング" :[]、 "時間":0.43 }
3回のクエリの合計。
プロパティ関連するデータに関連付けられた雄弁な方法にアクセスすると、「遅延読み込みを。」関連するデータは唯一の本当の負荷になるまで、このプロパティへの最初の訪問です。しかし、雄弁は、サブクエリに関連する親モデルの「事前ロード」することができます。N + 1クエリ問題を緩和することができプリロード。
遅延ロードを使用する場合は、ときにそれを事前にロードされて使用するには?だけ遅延読み込みの使用を実証する必要がある内容で事前ロードされたコンテンツを使用して提示するコンテンツリストデータ。