勉強中のLaravelで内部結合(inner join)をするときにちょっと困ったので備忘録。
実際にはもっと長くてごちゃごちゃしていますが、以下のような結合をしたかった。
select
a.id, a.name, b.result
from
atable as a
inner join btable as b on a.code = b.code
where
a.code = 1 and b.result > 2
入門書片手に勉強しているだけなので、こうしてモデル内にメソッドとして定義すべきなのかコントローラー側でwhereとかjoinとか書くべきなのかわからない。
こうしてモデル内に書いておいた方が個人的には見やすくて好きだからこうしています。
namespace App; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Facades\DB;
class Location extends Model
{
protected $table = 'atable';
public $timestamps = false;
public function getData(){
return DB::table($this->table)
->join('btable as b', 'atable.code', '=', 'b.code')
->where('atable.code', '1')
->where('b.result', '>', '2')
->select('atable.id', 'atable.name', 'b.result')
->get();
}
}
やっていることは全く同じだけどこういう風にも書ける。
こっちの方が元のクエリっぽい。
public function getData(){
return DB::table('atable as a')
->join('btable as b', 'a.code', '=', 'b.code')
->where('a.code', '1')
->where('b.result', '>', '2')
->select('a.id', 'a.name', 'b.result')
->get();
}