2

我有以下型号:

<?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 filterColumnWHERE它允许您为特定列定义自定义子句。但据我所知,a)要求您使用查询构建器手动定义列,并且b)只能直接在模型上工作,而不是它的关系之一。

有什么方法可以像使用关系的“真实”属性一样搜索和排序这个访问器属性?

4

2 回答 2

1

所以这就是我最终解决这个问题的方法。这不是一个理想的解决方案,但基本上我在 SQL 中重新创建了访问器,手动构建查询,然后使用 Datatables 的filterColumn功能。

<?php
class UserController extends Controller {
    public function dt() {
        $concat = "CONCAT(departments.name, '@', departments.domain)";

        $users = User::select(["users.*", DB::raw("$concat AS dept_email")])
            ->leftJoin("departments", "users.department_id", "=", "departments.id")
            ->whereNull("departments.deleted_at")
            ->where("location_id", session("current_location"))
            ->with("departments");

        return DataTables::of($users)
            ->filterColumn(
                "dept_email",
                fn ($q, $k) => $q->whereRaw("$concat LIKE ?", ["%$k%"]);
            )
            ->make();
    }
}

然后我只是将生成的列包含在我的表定义中,搜索按预期工作。

于 2020-02-05T18:26:14.380 回答
0

尝试将访问器附加到模型。

class Department extends Model {

    protected $appends = ['email'];

    // the rest of your code
}

注意:appends数组中的属性也将尊重模型上配置的visiblehidden设置。

来源:将值附加到 JSON

于 2018-11-20T19:09:15.587 回答