【问题标题】:Pass chain function as paramter as parameter in php将链函数作为参数传递为php中的参数
【发布时间】:2018-11-22 04:24:42
【问题描述】:

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

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      
}

有没有办法做到这一点?任何帮助,将不胜感激。谢谢。

【问题讨论】:

  • $join_as_parameter 的值是多少?是表名吗?
  • 我更新了问题
  • 你已经回答了你的问题
  • $join_as_parameter 是一组婴儿车作为'table', 'sometable.id', '=', 'other_table' 还是整个join('table','sometable.id', '=', 'other_table') 功能?
  • 或者你可以解释一下用例,有人可以提供更好的解决方案。

标签: php laravel method-chaining


【解决方案1】:

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

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 期望它作为第一个参数。

【讨论】:

  • 这不能用 Model 代替 DB::query() 来实现
  • 是的。也可以通过 eloquent builder
  • 间接修改重载属性App\Model\Product::$joins无效
  • 我用 Eloquent 的方式更新了答案。但是,我没有得到错误。你的 Laravel 和 PHP 版本是多少?
  • 没关系。更新了答案。将$query->joins[] = $join; 替换为$query->joins = array_merge((array) $query->joins, [$join_as_parameter]);
猜你喜欢
  • 2018-07-06
  • 2018-02-01
  • 2021-04-13
  • 2019-11-23
  • 2011-05-11
  • 2014-01-18
  • 2023-04-02
相关资源
最近更新 更多