我需要在使用它的所有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'];
->
全球的? 只是在关闭时传递变量?
$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 :
或使用连接语句并在查询中包括状态。
$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;
在第二个回调中调用它?
最有用的评论
全球的? 只是在关闭时传递变量?