Laravel中Yajra Datatables集合添加/编辑列闭包失败问题
解决Yajra Datatables集合操作中闭包失效的问题
先理清示例里的User $user是什么
示例中的function(User $user)里的User $user是PHP的类型声明,完全不是User as $User的别名写法:
- 它用来指定这个闭包接收的参数必须是
App\User模型的实例,对应Datatable每一行的数据源对象 - 这么写的好处是让代码类型更清晰,IDE能提供属性/方法的自动提示,同时PHP会自动校验参数类型,如果传入的不是
User实例会直接报错
你的代码为什么会出现闭包失效
你用DB::table('a16')->get()查询得到的集合,里面的元素是stdClass(PHP标准对象),而不是User模型实例。这时候你在闭包里写function(User $user),因为类型不匹配,PHP会触发隐式错误,导致闭包无法正常执行,看起来就像“失效”了。
解决方案
根据你的场景,有两种处理方式:
方式1:如果a16表对应User模型(或想用模型查询)
直接用Eloquent模型查询代替DB门面,这样得到的集合元素是User实例,就能正常使用类型提示:
// 用User模型查询,得到User实例的集合 $search_alls = App\User::where('name', '=', 'john')->get(); return DataTables::collection($search_alls) ->addColumn('newclass', function(App\User $user) { // 这里可以正常访问User模型的属性或方法 return "自定义列内容:{$user->name}"; }) ->toJson();
方式2:必须用DB门面查询(表不对应User模型)
去掉闭包参数的类型提示,直接用通用变量接收stdClass对象,然后访问它的属性:
$search_alls = DB::table('a16') ->select('*') ->where('name', '=', 'john') ->get(); return DataTables::collection($search_alls) ->addColumn('newclass', function($item) { // $item是stdClass对象,直接访问表字段对应的属性 return "自定义列内容:{$item->name}"; }) ->toJson();
额外提示:如果a16表有对应的自定义模型(比如App\Models\A16),建议优先用模型查询,这样既可以用类型提示,还能利用Eloquent的关联、访问器等特性,代码会更优雅易维护。
内容的提问来源于stack exchange,提问作者robspin
相关产品推荐
相关产品推荐

