如何在 Laravel Yajra DataTables 中的关系列上编辑列
How to editColumn on a relationship column in Laravel Yajra DataTables
我正在使用 Laravel 6 和 Yajra 数据表。
我正在会话模型上创建 "SessionDataTable"。
该模型有患者关系
class Session extends Model
{
public function patient()
{
return $this->belongsTo(Patient::class);
}
这是列定义:
protected function getColumns()
{
return [
Column::computed('action')
->exportable(false)
->printable(false)
->width(60)
->addClass('text-center'),
Column::make('id')->title('N°'),
Column::make('protocol_id')->title('Protocole')->data('protocol.name'),
Column::make('patient_id')->title('Patient')->data('patient.firstname')->name('patient.firstname'),
Column::make('room_id')->title('Salle')->data('room.name'),
Column::make('user_id')->title('Planifié par')->data('user.name'),
Column::make('scheduled_at')->title('Planifié le'),
];
}
这是专栏编辑:
public function dataTable($query)
{
return datatables()
->eloquent($query)
->editColumn('action', function ($model) {
if(!Gate::check('gestion')) {
return '';
}
return view('components.buttons.mini', [
'icon' => 'edit-pencil',
'url' => route($this->route_edit ?: strtolower(class_basename($model)) . '.edit', $model)
]);
})
->editColumn('scheduled_at', function ($model) {
return $model->scheduled_at->format('d/m/Y H:i');
})->editColumn('patient_id', function ($model) {
return $model->patient->name;
})->editColumn('name', function ($model) {
return $model->patient->firstname.' '.$model->patient->lastname;
})->editColumn('user_id', function ($model) {
return $model->user->firstname;
});
}
问题是这个 "editColumn('patient_id')" 被忽略了。我在数据表中有一个 patient_id 列,但它只包含列定义中定义的名字。 editColumn('name') 被完全忽略并且没有出现在数据表中。
目标是在DT Cell中显示患者的全名,这是Patient Model的名称属性。 名称属性不是数据库字段,它是一个 laravel 属性,它连接了名字和姓氏数据库字段
// Model Patient
public function getNameAttribute()
{
return $this->firstname . ' ' .$this->lastname;
}
我现在甚至不要求搜索或订购,我只能按姓氏订购和搜索,但我确实需要显示全名。为什么 editColumn 被忽略了?
这是数据表查询定义:
/**
* Get query source of dataTable.
*
* @param Session $model
* @return Builder
*/
public function query(Session $model)
{
return $model->newQuery()->with(['patient', 'room', 'user', 'protocol']);
}
好的,我发现自己:
如果您以这种方式在列定义中使用 ->data() :
Column::make('patient_id')->title('Patient')->data('patient.firstname')->name('patient.firstname'),
您需要在 editColumn 中使用与数据中相同的名称:->data(),在可能的情况下:patient.firstname
->editColumn('patient.firstname', function ($model) {
return $model->patient->name;
})
我正在使用 Laravel 6 和 Yajra 数据表。
我正在会话模型上创建 "SessionDataTable"。 该模型有患者关系
class Session extends Model
{
public function patient()
{
return $this->belongsTo(Patient::class);
}
这是列定义:
protected function getColumns()
{
return [
Column::computed('action')
->exportable(false)
->printable(false)
->width(60)
->addClass('text-center'),
Column::make('id')->title('N°'),
Column::make('protocol_id')->title('Protocole')->data('protocol.name'),
Column::make('patient_id')->title('Patient')->data('patient.firstname')->name('patient.firstname'),
Column::make('room_id')->title('Salle')->data('room.name'),
Column::make('user_id')->title('Planifié par')->data('user.name'),
Column::make('scheduled_at')->title('Planifié le'),
];
}
这是专栏编辑:
public function dataTable($query)
{
return datatables()
->eloquent($query)
->editColumn('action', function ($model) {
if(!Gate::check('gestion')) {
return '';
}
return view('components.buttons.mini', [
'icon' => 'edit-pencil',
'url' => route($this->route_edit ?: strtolower(class_basename($model)) . '.edit', $model)
]);
})
->editColumn('scheduled_at', function ($model) {
return $model->scheduled_at->format('d/m/Y H:i');
})->editColumn('patient_id', function ($model) {
return $model->patient->name;
})->editColumn('name', function ($model) {
return $model->patient->firstname.' '.$model->patient->lastname;
})->editColumn('user_id', function ($model) {
return $model->user->firstname;
});
}
问题是这个 "editColumn('patient_id')" 被忽略了。我在数据表中有一个 patient_id 列,但它只包含列定义中定义的名字。 editColumn('name') 被完全忽略并且没有出现在数据表中。
目标是在DT Cell中显示患者的全名,这是Patient Model的名称属性。 名称属性不是数据库字段,它是一个 laravel 属性,它连接了名字和姓氏数据库字段
// Model Patient
public function getNameAttribute()
{
return $this->firstname . ' ' .$this->lastname;
}
我现在甚至不要求搜索或订购,我只能按姓氏订购和搜索,但我确实需要显示全名。为什么 editColumn 被忽略了?
这是数据表查询定义:
/**
* Get query source of dataTable.
*
* @param Session $model
* @return Builder
*/
public function query(Session $model)
{
return $model->newQuery()->with(['patient', 'room', 'user', 'protocol']);
}
好的,我发现自己:
如果您以这种方式在列定义中使用 ->data() :
Column::make('patient_id')->title('Patient')->data('patient.firstname')->name('patient.firstname'),
您需要在 editColumn 中使用与数据中相同的名称:->data(),在可能的情况下:patient.firstname
->editColumn('patient.firstname', function ($model) {
return $model->patient->name;
})