There are many situations where you need to join same table, but must have different names (you can define this as alias). Below is a simple code snippet to show how you can join same table with different name.
$limit = 10;
$page = 1;
$groups = DB::table('person')
->leftJoin('users as for_user', function ($join) {
$join->on('for_user.id', '=', 'person.for_id')->where("for_user.id", "=", 10);
})
->join('users as by_user', function ($join) {
$join->on('by_user.id', '=', 'person.by_id');
})
->where('person.status', '=', 1)
->select('person.id', 'person.first_name', 'by_user.first_name')
->limit($limit)->offset($page * $limit)
->get();