我有以下型号:
<?php
class User extends Model {
public function department() {
return $this->hasOne(Department::class);
}
}
class Department extends Model {
protected $appends = ["email"];
public function getEmailAttribute() {
return "$this->name@$this->domain";
}
public function user() {
return $this->belongsTo(User::class);
}
}
我正在提取用户列表,包括他们的部门,并在具有服务器端分页/排序/搜索的数据表中显示(使用Laravel DataTables包):
<?php
class UserController extends Controller {
public function dt() {
$users = User::with("department")
->where("location_id", session("current_location"));
return DataTables::of($users)->make();
}
}
在数据表设置中,我的列之一定义如下:
{data: "department.email"}
这将email
毫无问题地显示访问器属性。当我尝试根据此列进行搜索或排序时,问题就来了:
DataTables 警告:表 id=DataTables_Table_0 - 异常消息:
SQLSTATE [42S22]:未找到列:1054 'where 子句'中的未知列'departments.email'
显然,datatables 不知道这是一个访问器,并试图将其包含在查询中——结果可预测。
我能找到参考的唯一解决方法是使用method filterColumn
,WHERE
它允许您为特定列定义自定义子句。但据我所知,a)要求您使用查询构建器手动定义列,并且b)只能直接在模型上工作,而不是它的关系之一。
有什么方法可以像使用关系的“真实”属性一样搜索和排序这个访问器属性?