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

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

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.
Avatar for supermanner supermanner
September 19, 2018

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

Avatar for supermanner

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が神