2017-08-24 63 views
1

我有以下的PHP代碼,我想知道是否可以有條件地鏈方法。如果角色爲空或空([]),我無法調用whereIn。這有效,但有沒有更乾淨的方法來做到這一點?如何在php中有條件地鏈接方法?

if ($params['roles']){ 
     $query1 = QB::table('personnel_role') 
      ->select(QB::raw('IF(personnel.nickname != "",CONCAT(IFNULL(personnel.first_name,"")," ", IFNULL(personnel.last_name, ""), " (",personnel.nickname,")"), CONCAT(IFNULL(personnel.first_name,"")," ", IFNULL(personnel.last_name,""))) AS "name", personnel.id')) 
      ->leftJoin('personnel', 'personnel_role.personnel_id', '=', 'personnel.id') 
      ->whereIn('personnel_role.role_id', $params['roles']) 
      ->groupBy('personnel.id')->limit($params['skip']) 
      ->offset($params['start']); 
     }else{ 
     $query1 = QB::table('personnel_role') 
      ->select(QB::raw('IF(personnel.nickname != "",CONCAT(IFNULL(personnel.first_name,"")," ", IFNULL(personnel.last_name, ""), " (",personnel.nickname,")"), CONCAT(IFNULL(personnel.first_name,"")," ", IFNULL(personnel.last_name,""))) AS "name", personnel.id')) 
      ->leftJoin('personnel', 'personnel_role.personnel_id', '=', 'personnel.id') 
      ->groupBy('personnel.id') 
      ->limit($params['skip']) 
      ->offset($params['start']); 
} 

回答

1

因爲你的查詢基本上除了whereIn一樣的,你可以釘,對以自身的條件。

$query1 = QB::table('personnel_role') 
    ->select(QB::raw('IF(personnel.nickname != "",CONCAT(IFNULL(personnel.first_name,"")," ", IFNULL(personnel.last_name, ""), " (",personnel.nickname,")"), CONCAT(IFNULL(personnel.first_name,"")," ", IFNULL(personnel.last_name,""))) AS "name", personnel.id')) 
    ->leftJoin('personnel', 'personnel_role.personnel_id', '=', 'personnel.id') 
    ->groupBy('personnel.id')->limit($params['skip']) 
    ->offset($params['start']); 

if($params['role']) { 
    $query1 = $query1->whereIn('personnel_role.role_id', $params['roles']); 
} 
+0

我在問,因爲我不確定自己(不知道這是什麼框架) - 但你確定這些方法不必以正確的順序調用嗎? – Qirel

+0

我也不確定。我使用的大多數框架都不關心訂單。 –

2

試試這個:

$query1 = QB::table('personnel_role') 
      ->select(QB::raw('IF(personnel.nickname != "",CONCAT(IFNULL(personnel.first_name,"")," ", IFNULL(personnel.last_name, ""), " (",personnel.nickname,")"), CONCAT(IFNULL(personnel.first_name,"")," ", IFNULL(personnel.last_name,""))) AS "name", personnel.id')) 
      ->leftJoin('personnel', 'personnel_role.personnel_id', '=', 'personnel.id'); 

if ($params['roles']) { 
    $query1->whereIn('personnel_role.role_id', $params['roles']) 
} 

$query1->groupBy('personnel.id') 
     ->limit($params['skip']) 
     ->offset($params['start']);