Laravel:数据表搜索选项不使用关系表字段

Posted

技术标签:

【中文标题】Laravel:数据表搜索选项不使用关系表字段【英文标题】:Laravel : Data-table search option not working using relationship table field 【发布时间】:2020-01-10 11:07:47 【问题描述】:

我在搜索连接表字段中的记录时遇到问题。我需要搜索所有列,包括连接表列。

这是我的所有国家和国家的控制器功能:

public function allStates()

    $states = State::select(['id', 'country_id', 'state_type', 'state_code', 'state_name', 'status'])->orderBy('country_id','Asc');
    return Datatables::of($states)
        ->addColumn('checkes', function ($states) 

            $data = $states;
            return view('partials.datatable.table_first_column_checkbox', compact('data'))->render();
        )
        ->editColumn('country_id', function ($states) 
            return  $states->country ? $states->country->country_name : "N/A";
        )
        ->editColumn('status', function ($states) 

            $data = $states;
            $statusChangeRoute = route('state.change.status');
            return view('partials.datatable.status-switch', compact('data','statusChangeRoute'))->render();
        )
        ->addColumn('action', function ($states) 

            $editRoute = route('states.edit', $states->id);
            $viewRoute = route('states.show', $states->id);
            $controlKeyword = 'state';
            return view('partials.datatable.table_edit_delete_action', compact('editRoute','viewRoute','controlKeyword'))->render();
        )
        ->addColumn('DT_RowId', function ($states) 

            return "tr_" . $states->id;
        )
        ->rawColumns(['checkes', 'status', 'action'])
        ->make(true);

在这个函数中,我刚刚编辑了country_id 列并返回$states->country->country_name

这是我的 js 函数:

<script type="text/javascript">
    $(document).ready(function () 
        table = $('#tblState').DataTable(
            processing: true,
            serverSide: true,
            pageLength: 10,
            ajax: 
                url: " route('admin.states.list') ",
                type: "POST",
                data: _token: "csrf_token()"
            ,
            columns: [
                data: 'checkes',    name: 'checkes', orderable: false, searchable: false,
                data: 'country_id', name: 'country_id',
                data: 'state_type', name: 'state_type',
                data: 'state_code', name: 'state_code',
                data: 'state_name', name: 'state_name',
                data: 'status',     name: 'status',
                data: 'action',     name: 'action', orderable: false, searchable: false
            ],
            "bStateSave": true,
            initComplete: function (settings, json) 
                // called on first time initialization
            ,
            drawCallback: function (settings) 
                // called on every server request
                // below function is compulsory put here with table id param
                initDTCheckBox('tblState');
            
        );
    );
</script>

这是我的视图屏幕

【问题讨论】:

【参考方案1】:

可以直接在查询中使用:

$states = State::select(['id', 'country_id', 'state_type', 
                'state_code', 'state_name', 'status'])
    ->orderBy('country_id', 'Asc')
    ->with('country');

然后直接在你的 JS 中使用:

data: 'country.country_name', name: 'country.country_name',

addColumn 只影响列的视图,而不影响查询。所以当你想订购,或者在你的数据表中搜索时,插件找不到值,你必须在查询中有它

【讨论】:

以上是关于Laravel:数据表搜索选项不使用关系表字段的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent 根据数据透视表字段条件获取多对多关系

使用现有表模式上的数据透视表在雄辩模型中指定关系字段

Laravel:搜索关系数据

Laravel 关系

Laravel中数据透视表的访问关系

如何使用 laravel 将表单字段保存在 2 个表中