【问题标题】:Server-side Yajra datatable columns:[] manipulation服务器端 Yajra 数据表列:[] 操作
【发布时间】:2020-07-17 06:43:09
【问题描述】:

我想操作 yajra 数据表

columns:[
    { data: 'fname', name: 'members.fname' },
    { data: 'fname', name: 'employees.emp_fname' }
]

使用如下所示的渲染功能并没有锻炼。 return 语句中有错误。该表不呈现任何数据。我只是找不到正确的解决方法。我已经使用了aliasaddColumn 并且效果很好,但问题是它不允许搜索名称。这就是我想出这种代码行的原因,因为它可能允许搜索它是否有效。请帮助解决这个问题。谢谢。

p3bills_table = $('#table-p3bills').DataTable({
    processing: true,
    serverSide: true,
    order: [
        [
            1, "asc"
        ]
    ],
    ajax: {
        url: "{{ route('get.p3bills') }}",
    },
    columns: [
        { data:'id', name:'p3bills.id' },
        { data:'id', name:'p3bills.id', orderable: true },
        { data:'p3loan_id', name:'p3loan_id' },
        { data:'schedule', name:'p3bills.schedule' },
        {
            render: function (data, type, full, meta) {
                if (full.member_id == 0) {
                    return data:'fname', name: 'employees.emp_fname';
                } else {
                    return data:'fname', name: 'members.fname';
                }
            }
        },
        { data:'lname', name:'members.lname' },
        { data:'mname', name:'members.mname' }
    ]
});

控制器

 public function getP3bills(){

    $p3bills = P3bill::leftJoin('p3payments', 'p3payments.p3bill_id', '=', 'p3bills.id')
                     ->leftJoin('members', 'members.id', '=', 'p3bills.member_id')
                     ->leftJoin('employees', 'employees.id', '=', 'p3bills.employee_id')
                     ->select(['members.id','members.lname','members.fname','members.mname','members.extension','employees.id','employees.emp_lname','employees.emp_fname','employees.emp_mname','employees.emp_extension','p3bills.*','p3payments.payment_amount','p3payments.or_number'])
                     ->selectRaw(  '('.
            'CASE'.
            ' WHEN members.id=0 THEN employees.emp_fname'.
            ' ELSE members.fname'.
            ' END'.
        ') AS person_name' );
    }

【问题讨论】:

    标签: javascript laravel datatables yajra-datatable


    【解决方案1】:

    您需要在后端处理这种情况。

    我假设您使用的是 Yajra DataTables service implementation

    您可以使用CASE 语句根据您的情况确定将返回的内容。

    例如:

    /**
     * Get query source of dataTable.
     *
     * @param \App\Models\User $model
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function query(User $model)
    {
        $query = $model->newQuery()
            ->select()
            ->selectRaw(
                '('.
                    'CASE'.
                    ' WHEN members.id=0 THEN employees.emp_fname'.
                    ' ELSE members.fname'.
                    ' END'.
                ') AS person_name'
            );
    
        return $query;
    }
    

    要在这个新列上启用搜索,您需要调用filterColumn() 方法。

    根据您的 Laravel DataTables 版本和选择的实现方法,您的代码可能会有所不同。例如,下面的代码是使用服务实现的 Laravel DataTables v9。

    /**
     * Build DataTable class.
     *
     * @param  mixed  $query Results from query() method.
     * @return \Yajra\DataTables\DataTableAbstract
     */
    public function dataTable($query)
    {
        return datatables($query)
            ->filterColumn('person_name', function($query, $keyword) {
                $query->whereRaw(
                    '('.
                        'CASE'.
                        ' WHEN members.id=0 THEN employees.emp_fname'.
                        ' ELSE members.fname'.
                        ' END'.
                    ') ILIKE ?', 
                    [ '%' . sql_escape_like($keyword) . '%' ]
                );
            });
    }
    

    我还使用以下辅助方法来转义 LIKE / ILIKE 子句中的特殊字符。

    if (! function_exists('sql_escape_like')) {
        /**
         * Escape special characters for SQL query with LIKE condition.
         *
         * @param  string $value
         * @return string
         */
        function sql_escape_like($value)
        {
            return str_replace(['\\', '%', '_'], ['\\\\', '\\%', '\\_'], $value);
        }
    }
    

    然后在 JavaScript DataTables 初始化代码中使用 { data:'person_name' } 作为列定义。

    【讨论】:

    • 这个我还没试过。我回家后会试试这个。这看起来不错。但是几天前我尝试过使用别名,问题是无法在数据表中搜索名称,因为数据库中不存在别名中使用的名称,在这种情况下为 person_name。我希望这段代码顺利。稍后我会给你更新。
    • 在数据表中搜索名称时是否有效?
    • 我编辑了我的帖子并显示了我的控制器功能,我应用了你的代码,但它没有在表中显示 employees.emp_fname,只有 members.fname。并且搜索不起作用。
    • @Eli,您是否将列定义替换为 { data: 'person_name' }
    • 是的,先生。 { data: 'person_name', name: 'person_name' },搜索不起作用,我不知道为什么它不会显示employees.emp_fname
    【解决方案2】:

    按照Gyrocode.com的建议,检查Controller中的状态并渲染 使用伪列的元素。在Controller中你可以这样做,

    $bills = Bill::all(); // Your Model Query goes here
    
    return datatables($bills)
            ->addColumn('fname', function ($bill) {
                if ($bill->member_id == 0) {
                    return $bill->employee->fname; // Employee First Name
                }
    
                return $bill->member->fname; // Member First Name
            })
            ->toJson();
    

    在 JavaScript 中你可以使用它,

    { data: 'fname' }
    

    【讨论】:

    • 此代码是否允许搜索名字?因为我在 yajra 中读到无法搜索 addColumn 函数中定义的名称。
    • add Column 是一个伪列,不允许在它们之间进行搜索。更多信息在这里github.com/yajra/laravel-datatables/issues/139
    • @linktoahref,你有一个很好的替代解决方案,但没有搜索工作。如果您使用filterColumn('fname', function ($query, $keyword){ },您将能够自定义搜索条件。
    猜你喜欢
    • 1970-01-01
    • 2016-09-17
    • 2018-06-19
    • 2022-12-10
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多