php - 将链函数作为参数传递给 php 中的参数

标签 php laravel method-chaining

我有一个功能。它具有需要执行的方法链接。

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      
}

有什么办法吗?任何帮助,将不胜感激。谢谢。

最佳答案

这样你就可以实现你所需要的。

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();

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

关于php - 将链函数作为参数传递给 php 中的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53423873/

相关文章:

php - 如何通过 PHP 使用 group 来统计 mysql?

PHP:将对象转换为数组会给我数组字段名称和命名空间的索引?

Laravel - 用户表,制作 id uuid 类型

javascript:在链中,如何获取前一个数组的大小?

php - ZendService\WindowsAzure 与 zf2

c# - 将数据从 Unity (C#) 发布到服务器 (PHP)。每个部分都可以单独工作,但不能一起工作

php - 使用PHP更新MySQL数据库并返回值

php - 如何在 Laravel 5 中验证路由参数?

javascript - MooTools 链接

swift - Swift 中的方法和属性链接调用