在PHP中将链式函数作为参数传递

3

我有一个函数,它需要执行方法链。

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      
}

它一直运行良好,但我需要对该函数进行轻微修改,我想要的是在该函数中传递联接 join 以实现方法链。

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
$join_as_parameter 的值是多少?它是一个表名吗? - Raj
我更新了问题。 - ashok poudel
你已经回答了你的问题。 - Raj
$join_as_parameter 是设置参数 'table', 'sometable.id', '=', 'other_table' 还是整个 join('table','sometable.id', '=', 'other_table') 函数? - Ijas Ameenudeen
或者您可以解释使用情况,然后有人可以提供更好的解决方案。 - Ijas Ameenudeen
显示剩余3条评论
1个回答

2
这样你就可以实现你所需的内容。
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到查询中。
要在Eloquent模型中使用此功能,请替换原有的内容。
$query = DB::query();

使用

$query = Model::query()->getQuery();

注意:由于JoinClause需要将其作为第一个参数,因此使用->getQuery()来检索Query\Builder对象。


可以。也可以通过Eloquent Builder传递。 - Ijas Ameenudeen
间接修改重载属性 App\Model\Product::$joins 没有效果。 - ashok poudel
我稍微更新了这个函数。问题是我从$this->model获取了$query。我还需要传递另一个查询吗? - ashok poudel
是的。我在答案中提到了这一点。JoinClause 需要你正在使用的查询构建器作为它的第一个参数。 - Ijas Ameenudeen
让我们在聊天中继续这个讨论 - ashok poudel
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接