Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用callable添加到Laravel查询_Php_Laravel_Eloquent - Fatal编程技术网

Php 使用callable添加到Laravel查询

Php 使用callable添加到Laravel查询,php,laravel,eloquent,Php,Laravel,Eloquent,我想使用可调用函数添加到Laravel查询中 例如,我有一个字符串用于对记录进行排序。基于此字符串,我想通过数组添加到查询中: public $sort = 'Newest'; public function sortQuery(Builder $query) { return [ 'Name' => $query->orderBy('name'), 'Newest' => $query->orderBy('created_at'

我想使用可调用函数添加到Laravel查询中

例如,我有一个字符串用于对记录进行排序。基于此字符串,我想通过数组添加到查询中:

public $sort = 'Newest';

public function sortQuery(Builder $query)
{
    return [
        'Name' => $query->orderBy('name'),
        'Newest' => $query->orderBy('created_at'),
        'Oldest' => $query->orderByDesc('created_at'),
    ];
}

public function paginateQuery()
{
    $query = User::query();

    foreach ($this->sortQuery($query) as $key => $value) {
        if ($this->sort == $key) {
            $query = $value;
        }
    }

    return $query->paginate();
}
在本例中,当我运行
$this->paginateQuery()
时,它不会按需要排序

我还尝试了
$query=$this->sortQuery($query)[$this->sort]
而不是
foreach
循环,结果相同


如何根据数组键将
$value
链接到
$query
上?

您可以稍微修改函数以立即应用排序,例如:

公共函数sortQuery(Builder$query,$sortKeys)
{
//定义映射以查找特定排序键的选项。
$map=[
'Name'=>['Name','ASC'],
//注:我把这个翻过来,最新的第一个意思是“降序日期”。
“最新”=>[“创建于”,“描述”],
“最早的”=>[“在”“ASC”“创建的”],
];
//循环给定的排序键。(数组)强制转换也允许传递字符串。
foreach((数组)$sortKey作为$sortKey){
//检查地图是否存在。
如果(isset($map[$sortKey])){
//使用splat运算符将映射值作为参数传递给orderBy函数
//(第二个参数可以是ASC/DESC)
$query->orderBy(…$map[$sortKey]);
}
}
您甚至可以将其定义为一个模型中的查询范围(最好是由多个雄辩模型继承的父类),请参见:

//Model.php
/**
*前缀“scope”是必需的。它可以被称为“$query->sortMe(…)”。
*/
公共函数scopeSortMe(生成器$query,$sortKeys)
{
//…相同的代码
}
//SomeController.php
//调用它只需要附加参数,而不需要$query对象。
$query->sortMe($sortkey);