我需要在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');
。这一点非常重要:-(