laravel - 按 Eloquent 访问器字段在 Yajrabox 数据表中排序

标签 laravel eloquent datatables

我有一个包含 first_name 和 last_name 字段的用户表,以及一个访问器 getFullNameAttribute,我使用 Yajrabox 数据表将其显示为交互式表。使用“全名”访问器,我可以很好地显示表格,但是当我尝试按“全名”字段排序时,实际上什么也没有发生。 ajax 调用被执行,但排序保持不变并且没有报告错误。我可以按任何其他字段进行排序,并且效果很好。 这个包添加的模型属性有排序限制吗?似乎无法在文档中找到任何内容。

非常感谢!

最佳答案

为了详细说明我的评论,这里有一个答案。

您不能使用虚拟属性(例如您想要的 getFullNameAttribute())进行排序和过滤。即使有效,它也会在内存中执行,因为 Laravel 无法自动将这些访问器转换为 SQL。

相反,您可以在 SQL 中重新创建所需的访问器。仅此还不够,因为 yajra 的 DataTables 包不能按表达式排序,只能按列名排序。因此,您必须将整个查询包装在另一个查询中。示例:

class UserDataTable extends DataTable
{
    public function query(): \Illuminate\Database\Query\Builder
    {
        return DB::query()->fromSub(
            User::query()
                ->select([
                    '*',
                    DB::raw("CONCAT(first_name, ' ', last_name) as full_name")
                ]),
            'wrapped'
        );
    }

    protected function getColumns(): array
    {
        return [
            ['data' => 'first_name', 'title' => 'First Name'],
            ['data' => 'last_name', 'title' => 'Last Name'],
            ['data' => 'full_name', 'title' => 'Full Name'],
        ];
    }
}

请注意,用 DB::query()->fromSub(...) 包裹表格会阻止您在过滤器部分使用类型提示:

public function dataTable($query): DataTableAbstract
{
    /** @var QueryDataTable $dataTable */
    $dataTable = datatables($query);

    return $dataTable
        ->editColumn('first_name', function ($user) {
            /** @var User|\stdClass $user */
            return ucfirst($user->first_name);
        });
}

使用 /** @var User|\stdClass $user */ 是一种在函数参数中没有类型提示的情况下仍然获得 IDE 支持的方法。

关于laravel - 按 Eloquent 访问器字段在 Yajrabox 数据表中排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56572883/

相关文章:

javascript - JQuery 数据表头与 tbody 不对齐?

javascript - JQuery 上下文菜单与 JQuery DataTable 集成

laravel - 如何在 Laravel4 中使用 withErrors 处理异常错误消息?

laravel - Stripe : Expire/Cancel subscription after n payments

php - 使用 Eloquent 选择关系计数为零的所有记录?

Laravel updateOrCreate 函数不更新自定义时间戳

jquery - 更改jquery数据表 "show 10 entries"选择框的值

php - 为什么带有 request->only() 的 if 语句不起作用? (Laravel)

php - 将 Laravel 应用程序转移到新服务器 - 无法正常工作

mysql - 如何使用 JOIN 来根据不同表中的 WHERE 语句检索行?