我需要在laravel策略中急切地加载关系,问题是我在yajra-datatable中使用了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';
}我在中使用它,如下所示:
public function table(Request $request)
{
$query = ProductionPlan::with(['branch','product.category','period'])->orderBy('created_at');
return \Yajra\DataTables\DataTables::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();
}这只对第一个关系是成功的,我试图删除第一个()方法,但是得到了错误PDO序列化。
Serialization of 'PDO' is not allowed发布于 2022-11-05 13:02:16
我认为Laravel策略使用的正是它所调用的对象。所以$this->user->can(.)实际上是作为第一个参数传递给create(用户$user)策略方法的相同对象。
在这种情况下,在调用闭包内的->can方法之前,我会尝试加载它。
代码可以如下所示:
public function table(Request $request)
{
$query = ProductionPlan::with(['branch','product.category','period'])->orderBy('created_at');
$user = $request->user;
$user->load('sections');
return \Yajra\DataTables\DataTables::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');。这是非常重要的:)
https://stackoverflow.com/questions/74252686
复制相似问题