Here’s is my modified search model function
public function search($params)
{
$this->load($params);
$session = Yii::$app->session;
$search = Yii::$app->request->getQueryParam('ProjectsSearch');
$query = Projects::find()
->select(['projects.ProjId', 'projects.ProjNo', 'projects.StatusId', 'projects.StatusIdJustificationId', 'projects.Invoiced', 'projects.XeroInvoiceId', 'projects.StartDt',
'projects.ClientId', 'projects.DispatcherId', 'projects.CompTripNo', 'projects.TruckNo']);
$query->with(['projectsLegs', 'client', 'dispatcher', 'status']);
// $query->joinWith('status');
// $query->joinWith('client');
// $query->joinWith('dispatcher');
// $query->joinWith('projectsLegs');
if( ArrayHelper::getValue($search, 'ProjLocked') == 1 ){
$query->rightJoin('projects_locks', 'projects.ProjId = projects_locks.ProjId');
}
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);
$pageSize = (isset($session['pageSize']) ? $session['pageSize'] : '100');
$dataProvider->pagination->pageSize = $pageSize;
/* SQL/Azure Version
********************************************/
$dataProvider->sort->attributes['ProjNo'] = [
'asc' => [new Expression('projects.ProjNo ASC')],
'desc' => [new Expression('projects.ProjNo DESC')],
];
$dataProvider->sort->attributes['StartDt'] = [
'asc' => [new Expression('CASE WHEN projects.StartDt IS NULL THEN 0 ELSE 1 END, projects.StartDt ASC')],
'desc' => [new Expression('CASE WHEN projects.StartDt IS NOT NULL THEN 0 ELSE 1 END, projects.StartDt DESC')],
];
$dataProvider->sort->attributes['StatusId'] = [
'asc' => [new Expression('CASE WHEN lst_projects_statuses.Status IS NULL THEN 0 ELSE 1 END, lst_projects_statuses.Status ASC')],
'desc' => [new Expression('CASE WHEN lst_projects_statuses.Status IS NOT NULL THEN 0 ELSE 1 END, lst_projects_statuses.Status DESC')],
];
$dataProvider->sort->attributes['ClientId'] = [
'asc' => [new Expression('CASE WHEN clients.Company IS NULL THEN 0 ELSE 1 END, clients.Company ASC')],
'desc' => [new Expression('CASE WHEN clients.Company IS NOT NULL THEN 0 ELSE 1 END, clients.Company DESC')],
];
$dataProvider->sort->attributes['CompTripNo'] = [
'asc' => [new Expression('CASE WHEN projects.CompTripNo IS NULL THEN 0 ELSE 1 END, projects.CompTripNo ASC')],
'desc' => [new Expression('CASE WHEN projects.CompTripNo IS NOT NULL THEN 0 ELSE 1 END, projects.CompTripNo DESC')],
];
$dataProvider->sort->attributes['TruckNo'] = [
'asc' => [new Expression('CASE WHEN projects.TruckNo IS NULL THEN 0 ELSE 1 END, projects.TruckNo ASC')],
'desc' => [new Expression('CASE WHEN projects.TruckNo IS NOT NULL THEN 0 ELSE 1 END, projects.TruckNo DESC')],
];
$dataProvider->sort->attributes['DispatcherId'] = [
'asc' => [new Expression('CASE WHEN user.FirstName IS NULL THEN 0 ELSE 1 END, user.FirstName ASC')],
'desc' => [new Expression('CASE WHEN user.FirstName IS NOT NULL THEN 0 ELSE 1 END, user.FirstName DESC')],
];
$dataProvider->sort->attributes['ProjLegEmpId'] = [
'asc' => [new Expression('CASE WHEN projects_legs.EmpId IS NULL THEN 0 ELSE 1 END, projects_legs.EmpId ASC')],
'desc' => [new Expression('CASE WHEN projects_legs.EmpId IS NOT NULL THEN 0 ELSE 1 END, projects_legs.EmpId DESC')],
];
$dataProvider->sort->attributes['ProjLegServTypeId'] = [
'asc' => [new Expression('CASE WHEN projects_legs.ServTypeId IS NULL THEN 0 ELSE 1 END, projects_legs.ServTypeId ASC')],
'desc' => [new Expression('CASE WHEN projects_legs.ServTypeId IS NOT NULL THEN 0 ELSE 1 END, projects_legs.ServTypeId DESC')],
];
$dataProvider->sort->attributes['ProjLegLocFrom'] = [
'asc' => [new Expression('CASE WHEN projects_legs.LocFrom IS NULL THEN 0 ELSE 1 END, projects_legs.LocFrom ASC')],
'desc' => [new Expression('CASE WHEN projects_legs.LocFrom IS NOT NULL THEN 0 ELSE 1 END, projects_legs.LocFrom DESC')],
];
$dataProvider->sort->attributes['ProjLegLocOrigin'] = [
'asc' => [new Expression('CASE WHEN projects_legs.LocOrigin IS NULL THEN 0 ELSE 1 END, projects_legs.LocOrigin ASC')],
'desc' => [new Expression('CASE WHEN projects_legs.LocOrigin IS NOT NULL THEN 0 ELSE 1 END, projects_legs.LocOrigin DESC')],
];
$dataProvider->sort->attributes['ProjLegLocDest'] = [
'asc' => [new Expression('CASE WHEN projects_legs.LocDest IS NULL THEN 0 ELSE 1 END, projects_legs.LocDest ASC')],
'desc' => [new Expression('CASE WHEN projects_legs.LocDest IS NOT NULL THEN 0 ELSE 1 END, projects_legs.LocDest DESC')],
];
$dataProvider->sort->attributes['ProjLegStartDt'] = [
'asc' => [new Expression('projects_legs.StartDt ASC')],
'desc' => [new Expression('projects_legs.StartDt DESC')],
];
$dataProvider->sort->attributes['ProjLegEmpInvRcvd'] = [
'asc' => [new Expression('projects_legs.EmpInvRcvd ASC')],
'desc' => [new Expression('projects_legs.EmpInvRcvd DESC')],
];
$dataProvider->sort->attributes['ProjLegEmpInvRcvdDt'] = [
'asc' => [new Expression('projects_legs.EmpInvRcvdDt ASC')],
'desc' => [new Expression('projects_legs.EmpInvRcvdDt DESC')],
];
$dataProvider->sort->attributes['ProjLegVendorTotalBilled'] = [
'asc' => [new Expression('projects_legs.VendorTotalBilled ASC')],
'desc' => [new Expression('projects_legs.VendorTotalBilled DESC')],
];
$dataProvider->sort->attributes['ProjLegDispatcherId'] = [
'asc' => [new Expression('projects_legs.DispatcherId ASC')],
'desc' => [new Expression('projects_legs.DispatcherId DESC')],
];
$dataProvider->sort->defaultOrder = ['ProjNo' => SORT_DESC];
if (!$this->validate()) {
return $dataProvider;
}
//If no filter applied restrict to the (last 3 months) OR (those not cancelled or Completed)
$appliedSearchParams = false;
if(isset($search)){
foreach ($search as $key => $value) {
if (strlen($value)>0){
$appliedSearchParams = true;
break;
}
}
}
if ($appliedSearchParams === false) {
$startDate = date("Y-m-d", strtotime('-3 month'));
$endDate = date("Y-m-d");
$query->where(['between', 'projects.StartDt', $startDate, $endDate]);
$query->orWhere(['not in', 'projects.StatusId', [1, 6]]);
}else{
$query->andFilterWhere([
'projects.Invoiced' => $this->Invoiced,
'projects.ProjNo' => $this->ProjNo,
'projects.StatusId' => $this->StatusId,
'projects.ContactId' => $this->ContactId,
'projects.DispatcherId' => $this->DispatcherId,
'projects_legs.EmpId' => $this->ProjLegEmpId,
'projects_legs.ServTypeId' => $this->ProjLegServTypeId,
'projects_legs.EmpInvRcvd' => $this->ProjLegEmpInvRcvd,
'projects_legs.DispatcherId' => $this->ProjLegDispatcherId,
'projects_legs.VendorTotalBilled' => $this->ProjLegVendorTotalBilled,
]);
$query->andFilterWhere(['like', 'clients.Company', $this->ClientId])
->andFilterWhere(['like', 'projects.CompTripNo', $this->CompTripNo])
->andFilterWhere(['like', 'projects.TruckNo', $this->TruckNo])
->andFilterWhere(['like', 'projects_legs.LocFrom', $this->ProjLegLocFrom])
->andFilterWhere(['like', 'projects_legs.LocDest', $this->ProjLegLocDest]);
if (isset($this->ProjLegStartDt) && $this->ProjLegStartDt != '') {
$date1 = trim($this->ProjLegStartDt)." 00:00:00.000000";
$date2 = trim($this->ProjLegStartDt)." 23:59:59.999999";
$query->andFilterWhere(['between', 'projects_legs.StartDt', $date1, $date2]);
}
if (isset($this->ProjLegEmpInvRcvdDt) && $this->ProjLegEmpInvRcvdDt != '') {
$date_explode = explode(" to ", $this->ProjLegEmpInvRcvdDt);
$date1 = trim($date_explode[0])." 00:00:00.000000";
$date2 = trim($date_explode[1])." 23:59:59.999999";
if ( $date1 != $date2) {
$query->andFilterWhere(['=', 'projects_legs.EmpInvRcvd', 1])
->andFilterWhere(['>=', 'projects_legs.EmpInvRcvdDt', $date1])
->andFilterWhere(['<=', 'projects_legs.EmpInvRcvdDt', $date2]);
}else{
$query->andFilterWhere(['=', 'projects_legs.EmpInvRcvd', 1])
->andFilterWhere(['=', 'projects_legs.EmpInvRcvdDt', $date1]);
}
}
if (isset($this->StartDt) && $this->StartDt != '') {
$date_explode = explode(" to ", $this->StartDt);
$date1 = trim($date_explode[0])." 00:00:00.000000";
$date2 = trim($date_explode[1])." 23:59:59.999999";
if ( $date1 != $date2) {
$query->andFilterWhere(['>=', 'projects.StartDt', $date1])
->andFilterWhere(['<=', 'projects.StartDt', $date2]);
}else{
$query->andFilterWhere(['=', 'projects.StartDt', $date1]);
}
}
}
return $dataProvider;
}
and then applying your value function, that means it runs a separate query for each row of the gridview, in my case 100 rows, so another 100 queries to be executed.
Is there a way, as part of the Search to return those columns and use them directly instead of using a value function in the gridviewl column?
‘value’=>‘client.Company’
since Company is from the clients tables, which is already in use as part of the SearchModel, can it be accessed directly in the gridview column?