对于yajra数据表的使用,在Laravel Policy中执行eagerload的最有效方法



我需要在laravel策略中加载关系问题是我在yajra数据表中使用了laravel策略它将逐行加载它(策略(

代码如下:

public function create(User $user)
{
$user->load('sections');
$sections = collect($user->sections->toArray())->pluck('name');

return
in_array($user->role_id,[3,4])
&& in_array('Produksi', $sections->toArray())
&& Session::get('productionPlans-branch') !== 'all'
&& Session::get('productionPlans-period') !== 'all';
}

我在我的yajra数据表中使用它,如下所示:

public function table(Request $request)
{
$query = ProductionPlan::with(['branch','product.category','period'])->orderBy('created_at');
return YajraDataTablesDataTables::of($query)
->addIndexColumn()
->addColumn('action', function($row) {
if ($request->user->can('create', $row)) {
return '<a href="javascript:void(0)" onclick="show('. $row->id .')">Add</a>';
}
})
->rawColumns(['action'])
->make(true);
}

所以每一行都会一次又一次地加载关系

我希望有更有效的方法只加载一次,而不是逐行加载关系我怎样才能做到这一点?

更新:

我试图在用户模型上使用访问者来附加与部分表的关系

protected $appends = ['sections'];
public function getSectionsAttribute ()
{
return $this->attributes['sections'] = $this->sections()->first();
}

这只对FIRST关系成功,我试图删除FIRST((方法,但得到了错误PDO序列化而不是

Serialization of 'PDO' is not allowed

我认为Laravel策略使用了它被调用的确切对象。所以$this->用户->can(…(实际上是作为第一个参数传递给create(User$User(策略方法的同一个对象。

在这种情况下,我会尝试在您调用->可以在闭合内部使用方法。

代码可能看起来像这样:

public function table(Request $request)
{
$query = ProductionPlan::with(['branch','product.category','period'])->orderBy('created_at');
$user = $request->user;
$user->load('sections');
return YajraDataTablesDataTables::of($query)
->addIndexColumn()
->addColumn('action', function($row) use ($user) {
if ($user->can('create', $row)) {
return '<a href="javascript:void(0)" onclick="show('. $row->id .')">Add</a>';
}
})
->rawColumns(['action'])
->make(true);
}

然后,您还必须记住从策略中的create((方法内部删除$user->load('sections');。这一点非常重要:-(

最新更新