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

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

13b3537132f1f61b4b905185426b4740?s=47 supermanner
September 19, 2018

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

13b3537132f1f61b4b905185426b4740?s=128

supermanner

September 19, 2018
Tweet

Transcript

  1. 雰囲気で使わないjoinメソッド Connehito Inc. @super_manner 1

  2. ▪ お品書き • 自己紹介 • いろんなjoin句がある話 • まとめ

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

    雑用全般 ◦ 他人の成果を自分のことのように話す • 苦手なこと ◦ スライド作成
  4. ところで皆さん 普段join句ってどうやって書いていますか? 4

  5. None
  6. ▪ 今日の目的 • 各join句の挙動を知って、雰囲気でつかわず適切な メソッドがつかえるようになること • 基本的にはCookBookの車輪の再発明です • 普段からやってるよ!という方は引き続きランチタ イムをお楽しみください

  7. ▪ CakePHPに存在する3つのjoinメソッド • join • matching • joinWith

  8. ▪ joinメソッド • Databaseにより近い場所でのクエリの 組み立てを行う • inner/left/rightのラッパーが存在して いる

  9. ▪ joinメソッド

  10. ▪ joinメソッド • 特にORMの制約を受けないので直感的なjoin句を 作りたい場合や、データセットをEntityに準拠せず に取得したい場合に有用 • ただし、深いネスト等を考えるのが面倒 • callableを渡すインターフェースがないので、複雑な

    データを一気に処理してもらうことが出来ない ◦ 自分で条件文を書く必要がある
  11. ▪ 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));
  12. ▪ matchingメソッド • シンプルなインターフェース • Database/Queryをextendsしている • innerJoinのみ • イーガーローディング

    ◦ 事前にアソシエーションを組んでおく必要がある ◦ 組んでいない場合はgetAssociation時にアソシ エーション定義の例外を吐いて終了
  13. ▪ matchingメソッド

  14. ▪ matchingメソッド • Eager LoadメソッドにsetMatchingされたタイミングで下記の2 つが操作される ◦ fields: joinsした側のfieldを結果セット ◦

    negateMatch: マッチしないものをフィルタするフラグ ▪ デフォルトはONだが、notMatching以外は基本内部で OFFにされる • execute時にappendToメソッドがcallされて上記のフラグが考 慮される • matchingDataに、関連データが格納される
  15. ▪ 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));
  16. ▪ joinWithメソッド • シンプルなインターフェース • inner/left/rightの3種類の指定が可能 • 基本的にはmatchingと一緒 ◦ つまりイーガーロードされる

  17. ▪ joinWithメソッド

  18. ▪ joinWithメソッド • Eager LoadメソッドにsetMatchingされたタイミングで下記の2 つが操作される ◦ fields: joinsした側のfieldを結果セットしない ◦

    negateMatch: 強制的にOFF ◦ joinType: ラッパーメソッド側からTypeを渡してあげる • 基本動作はmatchingと同じだが、バリエーションに富む ◦ matchingはinnerのみ • 関連データのロードは行われない
  19. ▪ 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));
  20. まとめ 20

  21. ▪ まとめ • シンプルにデータを取得したいときはjoinをつかう ◦ 取得データがシンプル ◦ 取得条件がシンプル • 既存のアソシエーションが存在するときはmatching/joinWithを

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