Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

■ お品書き ● 自己紹介 ● いろんなjoin句がある話 ● まとめ

Slide 3

Slide 3 text

■ 自己紹介 ● 結城茉奈 @super_manner ○ コネヒト株式会社 ● 得意なこと ○ 雑用全般 ○ 他人の成果を自分のことのように話す ● 苦手なこと ○ スライド作成

Slide 4

Slide 4 text

ところで皆さん 普段join句ってどうやって書いていますか? 4

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

■ CakePHPに存在する3つのjoinメソッド ● join ● matching ● joinWith

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

■ joinメソッド

Slide 10

Slide 10 text

■ joinメソッド ● 特にORMの制約を受けないので直感的なjoin句を 作りたい場合や、データセットをEntityに準拠せず に取得したい場合に有用 ● ただし、深いネスト等を考えるのが面倒 ● callableを渡すインターフェースがないので、複雑な データを一気に処理してもらうことが出来ない ○ 自分で条件文を書く必要がある

Slide 11

Slide 11 text

■ 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));

Slide 12

Slide 12 text

■ matchingメソッド ● シンプルなインターフェース ● Database/Queryをextendsしている ● innerJoinのみ ● イーガーローディング ○ 事前にアソシエーションを組んでおく必要がある ○ 組んでいない場合はgetAssociation時にアソシ エーション定義の例外を吐いて終了

Slide 13

Slide 13 text

■ matchingメソッド

Slide 14

Slide 14 text

■ matchingメソッド ● Eager LoadメソッドにsetMatchingされたタイミングで下記の2 つが操作される ○ fields: joinsした側のfieldを結果セット ○ negateMatch: マッチしないものをフィルタするフラグ ■ デフォルトはONだが、notMatching以外は基本内部で OFFにされる ● execute時にappendToメソッドがcallされて上記のフラグが考 慮される ● matchingDataに、関連データが格納される

Slide 15

Slide 15 text

■ 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));

Slide 16

Slide 16 text

■ joinWithメソッド ● シンプルなインターフェース ● inner/left/rightの3種類の指定が可能 ● 基本的にはmatchingと一緒 ○ つまりイーガーロードされる

Slide 17

Slide 17 text

■ joinWithメソッド

Slide 18

Slide 18 text

■ joinWithメソッド ● Eager LoadメソッドにsetMatchingされたタイミングで下記の2 つが操作される ○ fields: joinsした側のfieldを結果セットしない ○ negateMatch: 強制的にOFF ○ joinType: ラッパーメソッド側からTypeを渡してあげる ● 基本動作はmatchingと同じだが、バリエーションに富む ○ matchingはinnerのみ ● 関連データのロードは行われない

Slide 19

Slide 19 text

■ 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));

Slide 20

Slide 20 text

まとめ 20

Slide 21

Slide 21 text

■ まとめ ● シンプルにデータを取得したいときはjoinをつかう ○ 取得データがシンプル ○ 取得条件がシンプル ● 既存のアソシエーションが存在するときはmatching/joinWithを つかう ○ Entityとしてできあがったデータセットが欲しい時 ○ 深いアソシエーションを組んで全てに条件を波及させたい とき ● メソッドの構造を追うときはPhpStormが神

Slide 22

Slide 22 text

ご清聴ありがとうございました 22