Передать функцию цепочки как параметр в качестве параметра в php - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть функция.У него есть цепочка методов, которую нужно выполнить.

public function someFunction()
{
        $query=$this->model;
    $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      
}

Она работала нормально, но мне нужно немного изменить эту функцию, я хочу передать соединение в эту функцию для цепочки методов.

public function someFunction($join_as_parameter)
{
        $query=$this->model;
    $query->select($columns)
        //Join should be executed here as a parameter in method chaning . 
        ->skip($request->get('start') * $request->get('length'))
        ->take($request->get('length'))
        ->orderBy(
            $request->get('sort_column'),
            $request->get('sort_direction')
        )
        ->get();

    //Some other task      
}

Так что окончательное выполнение функции будет таким:

public function someFunction($join_as_parameter)
{
        $query=$this->model;
    $query->select($columns)
        ->join('table','sometable.id', '=', 'other_table') 
        ->skip($request->get('start') * $request->get('length'))
        ->take($request->get('length'))
        ->orderBy(
             $request->get('sort_column'),
             $request->get('sort_direction')
        )
        ->get();

    //Some other task      
}

Есть ли способ сделать это?Любая помощь будет оценена.Благодаря.

1 Ответ

0 голосов
/ 22 ноября 2018

Таким образом, вы можете достичь того, что вам нужно.

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 ожидает его в качестве первого параметра.

...