Мне нужно установить одну переменную на каждой итерации таблицы данных, чтобы использовать все функции addColumn () и editColumn ().
Что-то вроде
``
return Datatables :: of ($ users)
-> setGlobal (функция ($ user) {
$ status = getUserStatus ($ user-> id) ;
})
-> addColumn ('статус', функция ($ user) {
// возвращаем getUserStatus ($ user-> id);
вернуть статус $;
});
-> editColumn ('is_approved', function ($ user) {
// вернуть getUserStatus ($ user-> id)? истина: ложь;
возврат ($ статус)? истина: ложь;
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;
пожалуйста, не закрывайте вопрос до рассмотрения разработчика.
Если вы хотите, чтобы это происходило на каждой итерации, то это НЕ ГЛОБАЛЬНО .
->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://datatables.yajrabox.com/relation/belongs-to
Или используйте операторы соединения и включите статус в свой запрос.
$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
function getUserStatus ($ id) {
return Cache :: Remember ('user.status.'. $ id, 1, function ($ id) {
return Status :: find ($ id);
});
}
->setGlobal(function ($user){
//for $user->id = 1 //status = true
//for $user->id = 2 // status = false
$status = getUserStatus($user->id);
})
Надеюсь, что что-то подобное будет там
Не совсем уверен в вашем предложении setGlobal
так как вам все равно нужно будет перебирать каждого пользователя, чтобы иметь возможность получить статус, поэтому вызов нескольких функций все равно будет выполняться ..
Я действительно ищу выход, чтобы избавиться от сотен повторяющихся запросов. просто потому, что вызвать getXYZ и установитьXYZ более чем в одном столбце.
У меня тоже такая же проблема, и я хочу использовать глобальную (общую) переменную, чтобы я мог использовать ее для каждой итерации как общую переменную.
@ruchisheth Если у вас что-то есть, поделитесь, пожалуйста, своим ответом
Спасибо за помощь в продвижении.. :)
тот же @ruchisheth
@rajanjain и @haratmalli У меня нет решения для этого.
привет, вы пробовали в первом столбце поставить
данные-> статуи = 4;
позвонить по второму обратному вызову?
Самый полезный комментарий
Глобальный? просто передать переменную при закрытии?