Ваш запрос присоединится к ним, но в конечном итоге он возвращает только значения из A.
Может быть, что-то подобное будет работать для вас:
\DB::table('table1 as A')
->join(\DB::raw("(SELECT
id, name, age, rollnum, COUNT(*),
FROM table2
GROUP BY B.name, B.age
HAVING count(*) > 1
) as B"), function($join){
$join->on("A.name", "=", "B.name")->on("A.age", "=", "B.age");
})
->select(
\DB::raw('IFNULL(A.id, B.id) AS id'),
\DB::raw('IFNULL(A.name, B.name) AS name'),
\DB::raw('IFNULL(A.age, B.age) AS name'),
\DB::raw('IFNULL(A.rollnum, B.rollnum) AS rollnum')
)
->orderBy('name')
->get();