首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Laravel策略中使用yajra-datatable的最有效的方法

在Laravel策略中使用yajra-datatable的最有效的方法
EN

Stack Overflow用户
提问于 2022-10-30 11:34:34
回答 1查看 93关注 0票数 0

我需要在laravel策略中急切地加载关系,问题是我在yajra-datatable中使用了laravel策略,它将逐行加载它(策略)。

代码如下所示:

代码语言:javascript
复制
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';
}

我在中使用它,如下所示:

代码语言:javascript
复制
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);
}

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

我期待更有效的方式,只加载他们一次,而不是加载关系的关系线,我如何实现这一点?

更新:

我尝试使用用户模型上的访问器来添加带有区段表的关系。

代码语言:javascript
复制
protected $appends = ['sections'];

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

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

代码语言:javascript
复制
Serialization of 'PDO' is not allowed
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-05 13:02:16

我认为Laravel策略使用的正是它所调用的对象。所以$this->user->can(.)实际上是作为第一个参数传递给create(用户$user)策略方法的相同对象。

在这种情况下,在调用闭包内的->can方法之前,我会尝试加载它。

代码可以如下所示:

代码语言:javascript
复制
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');。这是非常重要的:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74252686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档