Таким образом, вы можете достичь того, что вам нужно.
use DB;
use Closure;
use Illuminate\Database\Query\JoinClause;
public function someFunction(Closure $join_clauser)
{
//create Query Builder object
$query = DB::query();
//Add the `$join` object to the table joins for this query
$join_as_parameter = call_user_func($join_closure, $query);
$query->joins = array_merge((array) $query->joins, [$join_as_parameter]);
$query->select($columns)
->skip($request->get('start') * $request->get('length'))
->take($request->get('length'))
->orderBy(
$request->get('sort_column'),
$request->get('sort_direction')
)
->get();
//Some other task
}
//create Query Builder object
$query = DB::query();
И выполнять функции как,
someFunction(function($query){
// return JoinClause object with joining conditions
return (new JoinClause($query, 'inner', 'table'))
->on('table.id', '=', 'othe_table.table_id');
});
Кроме того, вы можете изменить это, чтобы передать массив joins
вДобавьте несколько joins
ваш запрос.
Чтобы использовать это с красноречивыми моделями, замените
$query = DB::query();
на
$query = Model::query()->getQuery();
ПРИМЕЧАНИЕ :->getQuery()
используется для извлечения объекта Query\Builder
, поскольку JoinClause
ожидает его в качестве первого параметра.