Laravelでjoin

晴れ以前書いた、多言語対応サイトで、動作速度の問題に直面して、それの改善を行っていた。
$book->en->titleのような感じで英語のタイトルが、$book->ja->titleで日本語のタイトルが、$book->openで公開状況が取れるように、__callを使って、存在しないメソッドにアクセスした場合、呼び出しに使った「en」「ja」の部分を言語定義と照らし合わせて、あれば該当言語のbook_data.titleを参照するような感じ。
だが、これにはn+1問題が潜んでいて100件のデータを取得すると、101回のクエリーが発行されてしまう。
Controller側は、例えば
$books = Book::get();
だけで取れたりするのだが、Controllerを複雑にしてでも1回のクエリーで取得したいのでbookとbook_dataの各言語を結合するようにするしかなかった。
Laravelのjoin句と、joinの無名関数の中でonとwhereを組み合わせて。
Controllerは複雑になったが、速度は爆速。 SQL1回だけになったので、50倍くらいは速くなっていると思う。 探しきれてないだけかもしれないけど、どんな手法が最善なのかの旅は続く。

夜はジョギングへ。 昨日のジョグで体が疲れている感じが残っている。 キロ5分10秒ペースで30分間走なのだが、けっこうきつかった。
5.11, 5.06, 4.55, 5.12, 4.56, 4.57と、6kmを30分27秒で、キロ5分03秒ペースだった。