【问题标题】:Sorting by eloquent relationship in Laravel using DataTables使用 DataTables 在 Laravel 中按雄辩的关系排序
【发布时间】:2020-03-19 03:39:39
【问题描述】:

我正在尝试使用DataTables 来显示应用程序模型列表。 应用模型有操作:

public function operations(){
    return $this->hasMany('\App\Operation', 'application_id', 'id');
}

操作模型有状态:

public function state(){
    return $this->belongsTo('App\State', 'status_id', 'id');
}

及操作作者(用户):

public function user(){
    return $this->hasOne('App\User', 'id', 'user_id');
}

要启用数据表,我正在使用此代码:

                        $(function() {
                        $('#applications-table').DataTable({
                            language: {
                                "url": "/js/Polish.json"
                            },
                            processing: true,
                            serverSide: true,
                            ajax: '{!! route('applications.data') !!}',
                            columns: [
                                { data: 'number', name: 'number', className: "vertical_middle", searchable: true},
                                { data: 'operations.0.correspondence', name: 'operations.correspondence', className: "vertical_middle", orderable: false, searchable: false},
                                { data: 'operations.0.comment', name: 'operations.comment', className: "vertical_middle", orderable: false, searchable: true},
                                { data: 'operations.0.prognosed', name: 'operations.prognosed', className: "vertical_middle", searchable: false},
                                { data: 'operations.0.state.name', name: 'operations.state.name', className: "vertical_middle", searchable: false},
                                { data: 'operations.0.created_at', name: 'operations.created_at', className: "vertical_middle", type: "date", searchable: true},

                            ]
                        });

                    });

ApplicationController 正在使用此代码提供数据

        $model = Application::with(array(
        'operations' => function ($query) {
            $query->orderByDesc('operations.created_at')->with('state')->with('user');
        }
    ));

    return Datatables::of($model)->make(true);

最后一个问题 - 表格正在正确呈现,但是当我尝试按第一列之外的另一列排序时,我收到警告:

DataTables 警告:表 id=applications-table - 请求第 0 行的未知参数“operations.0.correspondence”。

老实说,我不知道如何让它发挥作用。 提前谢谢你。

【问题讨论】:

  • 您能告诉我们查询的结果吗?因为您应该知道 DataTable 期望您在查询返回时写入确切的列名。
  • @L.Flor 当然,这是点击排序另一列后的查询结果。 pastebin.com/X5PD0Kfd反正应该只返回3个应用,但是返回6行数据...
  • 如果你想使用DataTables我建议你不要使用关系。最好使用DB::select,然后使用join 更好。而且,你为什么在那里使用0
  • 获取操作数组的第一个元素。我试图制作 ->limit(1) 或 ->first() 但它不起作用......创建这个 Eloquent 模型(可能是我的代码)肯定有问题:)
  • 看看这个。 stackoverflow.com/a/33163415/6459968 在使用 DataTables 时使用 DB::select 比使用雄辩的关系要好得多。

标签: php laravel eloquent datatables


【解决方案1】:

已使用 DB::table

修复
    $applications = DB::table('applications as a')
    ->join('operations as o', function($join){
        $join->on('o.application_id', '=', 'a.id')
            ->on('o.id', '=', DB::raw("(SELECT max(id) from operations WHERE operations.application_id = a.id)"));
    })
    ->join('users as u', 'o.user_id', '=', 'u.id')
    ->join('states as s', 'o.status_id', '=', 's.id')
    ->select(['a.id as a_id','a.number','o.*', 'u.name as u_name', 'u.surname as u_surname', 's.name as s_name']);

return Datatables::of($applications)->make(true);

【讨论】:

    猜你喜欢
    • 2017-04-11
    • 2018-11-07
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 2018-11-12
    • 1970-01-01
    • 2015-03-14
    • 2018-11-28
    相关资源
    最近更新 更多