LaravelのQueryBuilderにもjoinがあります。
業務などで主に使うものは、inner joinとleft joinではないでしょうか。

inner joinの場合

join関数を使うことで可能です。
結合条件を、第2、第3、第4引数で表現します。
例) blogsテーブルにarticlesテーブルをinner joinする場合

$students = DB::table('blogs')
->join('articles', 'blogs.id', '=', 'articles.blog_id')
->select('blogs.*', 'articles.title')
->get();
・left join(left outer join)の場合
leftJoin関数を使うことで可能です。
$students = DB::table('blogs')
->leftJoin('articles', 'blogs.id', '=', 'articles.blog_id')
->select('blogs.*', 'articles.title')
->get();

複数のキーでjoinする場合

少々手間ですが、無名関数を使います。
例として、生徒が所属している部活の履歴テーブルを考えます。
部活の履歴テーブルには、生徒ごとに各学年でどこの部に所属していたかが記録されています。
また、その学校は学年のはじめに所属する部を決定し、一年間は継続しなければならないとします。
生徒テーブルと部活の履歴テーブルをjoinして、生徒が現時点で所属している部の一覧を調べることにしましょう。
studensテーブルとgroup_logsテーブルを、
studens.id と group_logs.student_id
students.grade と group_logs.grade
の2つのキーで結合します。

DB::table('students')
->join('group_logs', function ($join) {
$join->on('students.id', '=', 'group_logs.student_id');
$join->on('students.grade', '=', 'group_logs.grade');
})
->get();

上記のように、無名関数の中でonを数回使うことで、複数のキーでjoinすることができます。

joinとwhereの組み合わせについて

複数のキーでjoinする意図で、以下のようにwhereを使って記述しても動きません。

DB::table('students')
->join('group_logs', function ($join) {
$join->on('students.id', '=', 'group_logs.student_id');
$join->where('students.grade', '=', 'group_logs.grade');
})
->get();

SQLとして次のように展開されるためです。

select * from `students` inner join `group_logs` on `students`.`id` = `group_logs`.`student_id` and `students`.`grade` = ‘group_logs.grade’

students.grade(studentsテーブルのgradeカラム)に対して、”group_logs.grade”という文字列と比較してしまいます。
whereの場合は、あくまで値と組み合わせて使ってください。
学年が1年より上のデータのみを取り出したい場合、

DB::table('students')
->join('group_logs', 'students.id', '=', 'group_logs.student_id')
->where('group_logs.grade', '>', 1)
->get();

などと記述します。