Laravel-datatables: 如何为所有行分配全局变量。

创建于 2017-07-04  ·  16评论  ·  资料来源: yajra/laravel-datatables

问题或功能要求摘要

我需要在使用它的所有addColumn()和editColumn()函数的数据表的每次迭代中设置一个变量。

问题的代码段

就像是
```
返回Datatables :: of($ users)
-> setGlobal(function($ user){
$ status = getUserStatus($ user-> id) ;
})
-> addColumn('status',function($ user){
//返回getUserStatus($ user-> id);
返回$ status;
});
-> editColumn('is_approved',函数($ user){
//返回getUserStatus($ user-> id)吗? 真假;
返回($ status)? 真假;


so, each time I don't need to call this **getUserStatus($user->id)** function.
<!--
If applicable, please include a copy of your code
which triggers the suspected bug.

You may use the markdown php code tags to format your paste:

```php
$params = ['foo'];

->

系统详情

  • 操作系统
  • PHP版本
  • Laravel版本
  • Laravel-Datatables版本
question

最有用的评论

全球的? 只是在关闭时传递变量?

$status = getUserStatus($user->id);

return Datatables::of($users)
->addColumn('status', function ($user) use ($status) {
  return $status;
});

所有16条评论

全球的? 只是在关闭时传递变量?

$status = getUserStatus($user->id);

return Datatables::of($users)
->addColumn('status', function ($user) use ($status) {
  return $status;
});

我希望状态在每次迭代中都可以更改
对于每个用户,它都应该更改。

return Datatables::of($users) ->setGlobal(function ($user){ //for $user->id = 1 //status = true //for $user->id = 2 // status = false **$status** = **getUserStatus($user->id)**; }) ->addColumn('status', function ($user) { // return getUserStatus($user->id); return $status; }); ->editColumn('is_approved', function ($user) { //return getUserStatus($user->id) ? true : false; return ($status) ? true : false;

请不要在开发者审核之前解决问题。

如果您希望在每次迭代中使用它,则它不是GLOBAL

->addColumn('status', function ($user) {
    return getUserStatus($user->id);
});
->addColumn('status', function ($user) {
    return getUserStatus($user->id);
})
->editColumn('xyz', function ($user) {
    return getUserStatus($user->id);
});

对于每个添加或编辑列,我需要调用相同的函数。 这将调用MySql查询,因此,如果我有5个列使用此同一函数,则在一次迭代中,同一MySql查询将调用5次,并记录1000条记录,它将是1000 * 5 = 5000个重复查询。

如果我使用分页,那么最少还要有20条记录20 * 5 = 100个重复查询。

如果您要解决N + 1问题,请使用紧急加载。

有关参考,请参见此演示: https :

或使用连接语句并在查询中包括状态。

https://datatables.yajrabox.com/fluent/joins

$assignments = DB::table('assignments as a')
        ->when($round_id != "" || $round_id != NULL, function ($query) use ($round_id) {
            return $query->where('a.round_id', '=', $round_id);
        })
        ->leftJoin('rounds as r', 'a.round_id', '=', 'r.id')
        ->leftJoin('surveys as su', 'a.id', '=', 'su.assignment_id')
        ->leftJoin('projects as p', 'r.project_id', '=', 'p.id')
        ->leftJoin('sites as s',  'a.site_id', '=', 's.id')
        ->leftJoin('fieldreps as f', 'a.fieldrep_id', '=', 'f.id')
        ->leftJoin('chains as ch','p.chain_id','=','ch.id')
        ->leftJoin('clients as c','ch.client_id','=','c.id')
        ->when(is_string($status) && $status != "", function ($query) use ($status, $current_date) {
            if($status == 'late'){
                return $query->where(function ($query) use ($current_date) {
                    $query->where(function ($query)  {
                        $query->where(DB::raw('IFNULL( DATE_FORMAT(a.deadline_date,"%Y-%c-%e"), DATE_FORMAT(r.deadline_date,"%Y-%c-%e"))'), '<', DB::raw('CURDATE()'));
                    })
                    ->where(function ($query) use ($current_date) {
                        $query->where('a.is_scheduled', '=', true)
                        ->where('a.is_reported', '=', false)
                        ->where('a.is_partial', '=', false);
                    });
                });
            }else if($status == 'scheduled'){
                return $query->where(function ($query) use ($current_date) {
                    $query->where(function ($query)  {
                        $query->where(DB::raw('IFNULL( DATE_FORMAT(a.deadline_date,"%Y-%c-%e"), DATE_FORMAT(r.deadline_date,"%Y-%c-%e"))'), '>=', DB::raw('CURDATE()'));
                    })
                    ->where(function ($query) use ($current_date) {                     
                        $query->where('a.is_scheduled', '=', true)
                        ->where('a.is_reported', '=', false)
                        ->where('a.is_partial', '=', false);
                    });
                });
            }
            else if($status == 'pending'){
                return $query->leftJoin('assignments_offers as ao', function($join)
                {
                    $join->on('a.id', '=', 'ao.assignment_id');
                })
                ->where('a.is_scheduled', '=', false)
                ->where(DB::raw('(SELECT count(id) as offer_count FROM assignments_offers where assignment_id = a.id and is_accepted is null)'), '<=', '0')
                ->groupBy('a.id');
            }else if($status == 'offered'){
                return $query->leftJoin('assignments_offers as ao', function($join)
                {
                    $join->on('a.id', '=', 'ao.assignment_id');
                })
                ->where(['a.is_scheduled' => false, 'a.is_offered' => true])->where(['ao.is_accepted' => NULL])
                ->groupBy('ao.assignment_id');
            }else if($status == 'reported'){
                return $query->where(['a.is_reported' => true, 'is_approved' => false]);
            }else if($status == 'partial'){
                return $query->where('a.is_partial', true);
            }else if($status == 'completed' || $status == 'approved'){
                return $query->where('a.is_approved', true);
            }
        })
        ->select([
            'a.id',
            'a.fieldrep_id',
            'a.deadline_date',
            'a.is_scheduled',
            'a.is_reported',
            'a.is_partial',
            'a.is_offered',
            'a.is_approved',
            'c.client_logo',
            'p.id as project_id',
            'p.project_name',
            'r.id as round_id',
            'r.round_name',
            's.site_code',
            's.site_name',
            's.city',
            's.state',
            's.zipcode',
            'su.id as survey_id',
            DB::raw("CONCAT(IFNULL( DATE_FORMAT(a.schedule_date,'%d %b %Y'), DATE_FORMAT(r.schedule_date,'%d %b %Y')), ' ' , IFNULL(TIME_FORMAT(a.start_time, '%h:%i %p'), TIME_FORMAT(r.start_time,'%h:%i %p'))) as assignment_scheduled"),
            DB::raw("CONCAT(IFNULL( DATE_FORMAT(a.deadline_date,'%d %b %Y'), DATE_FORMAT(r.deadline_date,'%d %b %Y')), ' ' , IFNULL(TIME_FORMAT(a.start_time, '%h:%i %p'), TIME_FORMAT(r.deadline_time,'%h:%i %p'))) as assignment_end"),
            DB::raw('CONCAT(f.first_name," ",f.last_name) as schedule_to'),
            DB::raw('(select COUNT(id) as offer_count from assignments_offers where assignment_id = a.id and is_accepted is null group by assignment_id) as offer_count'),
            ]);

查询非常复杂。 别急着加载

要在添加和编辑列中使用getXYZ和setXYZ函数,我们必须需要一个Eloquent对象。

好吧,没想到会有那么复杂的查询。 ^ _ ^

可以考虑使用缓存吗? 如果状态不是经常更改,那么您也可以将其设置更长的时间。

- 编辑 -
也许像这样:
```PHP
函数getUserStatus($ id){
return Cache :: remember('user.status。'。$ id,1,function($ id){
返回状态:: find($ id);
});
}

->setGlobal(function ($user){
//for $user->id = 1 //status = true
//for $user->id = 2 // status = false
$status = getUserStatus($user->id);
})

希望有这样的事情

不是很确定您的建议setGlobal因为您仍然需要遍历每个用户才能获取状态,因此仍将执行多个功能调用。

我确实在寻找摆脱100多个重复查询的出路。 只是因为要在多个列中调用getXYZ和setXYZ。

我也有同样的问题,想使用全局(通用)变量,以便我可以将其作为通用变量用于每次迭代
@ruchisheth如果您有任何东西,请分享您的答案

我在这里先向您的帮助表示感谢.. :)

一样@ruchisheth

@rajanjain@haratmalli我对此没有任何解决方案。

嗨,您是否尝试过在第一栏中输入

数据->状态= 4;

在第二个回调中调用它?

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

ghost picture ghost  ·  3评论

ahmadbadpey picture ahmadbadpey  ·  3评论

techguydev picture techguydev  ·  3评论

FilipeBorges1993 picture FilipeBorges1993  ·  3评论

macnux picture macnux  ·  3评论