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

zfycwa2u  于 2022-11-18  发布在  其他
关注(0)|答案(1)|浏览(134)

我需要在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';
}

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

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();
}

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

Serialization of 'PDO' is not allowed
hs1ihplo

hs1ihplo1#

我认为Laravel策略使用的是调用它的确切对象。因此,$this-〉user-〉can(...)实际上是作为第一个参数传递给create(User $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');。这是非常重要的:-)

相关问题