javascript - Laravel:如何使用分页和过滤器按相关模型进行排序

标签 javascript laravel sorting

我的配置已经被阻止三天了。我无法按报告的模型排序,我尝试了很多方法但没有结论,例如 sortBy/sortByDesc、join table 但没有解决方案

我想执行分页、排序和服务器端过滤器。过滤器可以是多个。除了按相关模型排序外,一切正常 我得到的网址:http://127.0.0.1:8000/api/user/list?page=1&limit=30&sort=user__created_at&direction=desc&search__user__name=James&search__group__name=Client

查询search__model__col允许我在多个模型或列上链接多个搜索

这是我的代码:

    public static function pagination(Request $request, $model, $relation, $modelStringify)
    {
        $modelSortBy = explode('__', $request->query('sort'))[0]; // user
        $tableSortBy = explode('__', $request->query('sort'))[1]; // created_at
        $query       = $request->query(); // ['page' => 1, 'limit' => 30...]
        $direction   = $request->query('direction'); // desc
        try {

            $model = $model->with($relation);

            //TODO : orderBy relationship
            if ($modelSortBy === $modelStringify): // modelStringify = 'user'
                $model->orderBy($tableSortBy, $direction);
            else:
                 // sort server side here 
            endif;

            foreach (array_keys($query) as $q) {
                if (strpos($q, 'search__') === 0) {
                    $modelSearchBy = explode('__', $q)[1]; // ['user', 'group']
                    $tableSearchBy = explode('__', $q)[2]; // ['name', 'name']
                    $valueSearchBy = $query[$q];
                    if ($modelSearchBy === $modelStringify):
                        $model->where($tableSearchBy, 'like', $valueSearchBy . '%');
                    else:
                        $model->whereHas($modelSearchBy, function (Builder $q) use ($valueSearchBy, $tableSearchBy) {
                            $q->where($tableSearchBy, 'like', $valueSearchBy . '%'); // $valueSearchBy = ['James', 'Client']
                        });
                    endif;
                }
            }
            return $model;
        } catch (Exception $e) {
            return response()->json(['message' => $e], 400);
        }
    }

以下是 user belongsTo group 的示例:

return response()->json([
    'items' => Utils::pagination($request, new User(), [
        'group',
    ], 'user')->paginate($limit)->toArray()
]);

如何在此配置中引入按相关模型排序?

例如,对于按组名称排序,我得到 URL &sort=group__name

谢谢

最佳答案

看起来这在 Laravel 中并不容易完成。有人建议在 Laravel 中使用一种语法来执行此操作 here ,但泰勒关闭了该问题。

在所有其他资源上我可以找到人 suggest using joins ,但这不太适合您更通用的方法。

Laravel 最近还引入了“子查询增强功能”,其中包括按子查询值排序(在 this page 上搜索“Eloquent Subquery Improvements”),但我不知道如何使用它通过 Eloquent 关系进行排序更容易实现值(value)。

我认为你最好的选择是使用第三方软件包,例如从 Github 问题链接到的软件包 fico7489/laravel-eloquent-join 。安装后,您只需创建一个使用 use Fico7489\Laravel\EloquentJoin\Traits\EloquentJoin; 特征的新基本模型类,然后从模型继承该类。

use Fico7489\Laravel\EloquentJoin\Traits\EloquentJoin;
use Illuminate\Database\Eloquent\Model;

abstract class BaseModel extends Model
{
    use EloquentJoin;
class ExampleModel extends BaseModel

然后您将能够使用 orderByJoin 按关系排序功能:

$model->orderByJoin('<relationship>.<column>', $direction);

上面的relationship值将是您在模型上定义的关系的名称。

请记住,orderByJoin 函数仅支持 BelongsToHasOne 关系。

需要记住的一点是,Laravel 和 laravel-eloquent-join 包都不能保护您免受列名(或 orderByJoin 函数中的方向值)中的 SQL 注入(inject)。 Laravel docs建议您对列名称使用白名单:

PDO does not support binding column names. Therefore, you should never allow user input to dictate the column names referenced by your queries, including "order by" columns, etc. If you must allow the user to select certain columns to query against, always validate the column names against a white-list of allowed columns.

关于javascript - Laravel:如何使用分页和过滤器按相关模型进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59806135/

相关文章:

javascript - 适当裁剪图像问题

javascript - 使用 Ajax 向 PHP 发送数据

php - 在集合 laravel 中使用查询范围

python - 欺诈事件通知中出现超时错误 HackerRank

c++ - 将元素插入排序 vector 并保持元素排序

javascript - 如何通过progressbar插件逆时针旋转饼图?

javascript - 如何从 JavaScript 中的 URL 获取网站名称?

json - 如何在 Laravel 4 中将 JSON 数据 POST 到远程服务器?

php - Laravel - 类型错误 : Too few arguments?

c++ - 合并排序实现未按预期工作