Upgrade to Pro — share decks privately, control downloads, hide ads and more …

雰囲気で使わないCakePHP3 joinメソッド

supermanner
September 19, 2018

雰囲気で使わないCakePHP3 joinメソッド

supermanner

September 19, 2018
Tweet

More Decks by supermanner

Other Decks in Programming

Transcript

  1. ▪ 自己紹介 • 結城茉奈 @super_manner ◦ コネヒト株式会社 • 得意なこと ◦

    雑用全般 ◦ 他人の成果を自分のことのように話す • 苦手なこと ◦ スライド作成
  2. ▪ joinメソッドが吐くSQL SELECT Questions.id AS `Questions__id`, (中略) Questions.created AS `Questions__created`,

    Questions.modified AS `Questions__modified` FROM questions Questions INNER JOIN answers Answers ON (Answers.user_id = 7 AND Questions.id = (Answers.question_id));
  3. ▪ matchingメソッド • シンプルなインターフェース • Database/Queryをextendsしている • innerJoinのみ • イーガーローディング

    ◦ 事前にアソシエーションを組んでおく必要がある ◦ 組んでいない場合はgetAssociation時にアソシ エーション定義の例外を吐いて終了
  4. ▪ matchingメソッド • Eager LoadメソッドにsetMatchingされたタイミングで下記の2 つが操作される ◦ fields: joinsした側のfieldを結果セット ◦

    negateMatch: マッチしないものをフィルタするフラグ ▪ デフォルトはONだが、notMatching以外は基本内部で OFFにされる • execute時にappendToメソッドがcallされて上記のフラグが考 慮される • matchingDataに、関連データが格納される
  5. ▪ joinメソッドが吐くSQL SELECT Questions.id AS `Questions__id`, (中略) Questions.created AS `Questions__created`,

    Questions.modified AS `Questions__modified`, Answers.id AS `Answers__id`, Answers.user_id AS `Answers__user_id`, (中略) Answers.created AS `Answers__created`, Answers.modified AS `Answers__modified`, FROM questions Questions INNER JOIN answers Answers ON (Answers.user_id = 7 AND Questions.id = (Answers.question_id));
  6. ▪ joinWithメソッド • Eager LoadメソッドにsetMatchingされたタイミングで下記の2 つが操作される ◦ fields: joinsした側のfieldを結果セットしない ◦

    negateMatch: 強制的にOFF ◦ joinType: ラッパーメソッド側からTypeを渡してあげる • 基本動作はmatchingと同じだが、バリエーションに富む ◦ matchingはinnerのみ • 関連データのロードは行われない
  7. ▪ joinWithメソッドが吐くSQL SELECT Questions.id AS `Questions__id`, (中略) Questions.created AS `Questions__created`,

    Questions.modified AS `Questions__modified` FROM questions Questions INNER JOIN answers Answers ON (Answers.user_id = 7 AND Questions.id = (Answers.question_id));
  8. ▪ まとめ • シンプルにデータを取得したいときはjoinをつかう ◦ 取得データがシンプル ◦ 取得条件がシンプル • 既存のアソシエーションが存在するときはmatching/joinWithを

    つかう ◦ Entityとしてできあがったデータセットが欲しい時 ◦ 深いアソシエーションを組んで全てに条件を波及させたい とき • メソッドの構造を追うときはPhpStormが神