Eagle在Laravel中为jQuery Datatable加载动态属性


Eager Load Dynamic Attribute in Laravel for jQuery Datatable

我有一个Hotel模型,它是hasMany Guests,它又有两个动态属性,如下所示。

public function getNameAttribute(){
     return $this->user->name;
}
public function getEmailAttribute(){
    return $this->user->email;
}

现在我更喜欢将它们作为$hotel->guests()->with('user')获取。现在,当我将其用于Datatable时,我无法获得名称&电子邮件在视图中,原因显而易见。所以我的问题是,我能急切地加载名称&电子邮件属性,以便每当获取guest模型时,所述属性都可用。

请注意,我不返回asArrayasJson,因此$attributes数组的概念不适用(至少据我所知)。

控制器具有以下代码:

return Datatables::of($guests)
            ->addColumn('email',function($guest){
                return $guest->email;
            })
            ->addColumn('name',function($guest){
                return $guest->name;
            })->make(true);

但是,数据表无法搜索姓名或电子邮件,因为它们在数据库中不可用。

我使用的jquery数据表代码是

$(function() {
$('#guest-table').DataTable({
    processing: true,
    serverSide: true,
    ajax: '{!! route('guests.data') !!}',
    columns: [
        { data: 'name', name: 'name', orderable: false },
        { data: 'email', name: 'email', orderable: false},
        { data: 'mobile', name: 'mobile', orderable: false}
    ]
   });
});

我使用Laravel 5yajra/laravel-datatables

根据Yajra,Laravel文档,您必须以这种方式调用相关模型的属性,

{data: 'relation_name.column', name: 'relationName.column'}

所以在你的情况下会是这样,

{data: 'user.name', name: 'user.name'}
{data: 'user.email', name: 'user.email'}

这里使用双引号,如果此代码在刀片文件中,我将工作

 ajax: "{!! route('guests.data') !!}",

如果你有外部js文件,那么像这样使用

在刀片文件中创建隐藏字段

 <input type="hidden" id="route_url" value="{!! route('guests.data') !!}">

并且在js文件中通过id 获取路由url

ajax: $("#route_url").val(),