2017-02-08 11 views
0

У меня есть таблица, в которой указаны пользователи. Там у нас есть поля id, rating, active. Таким образом, пример может быть:Построить сложные вычисленные поля в cakephp 3

id | rating | active | group (computed) 
1 | 12  | 1  | 
2 | 1  | 0  | 
3 | 25  | 1  | 
4 | 20  | 1  | 
5 | 21  | 0  | 
6 | 12  | 1  | 
... 

Моя цель - расширить поля с помощью другого вычисленного группового поля. Я ожидаю 3 группы пользователей.

  • Те, которые имеют «0» в активном поле получить «-» в поле группы

Это был легкий один и пользователей с «1» в активном поле получат два goups назначены.

  • «лучшая» половина пользователей с лучшим рейтингом получит 1 в поле группы
  • «хуже» половина пользователей с худшим рейтингом получит 2 в поле группы

Таким образом, окончательный вычисленная таблица должна выглядеть

id | rating | active | group (computed) 
1 | 12  | 1  | 1 
2 | 1  | 0  | - 
3 | 25  | 1  | 2 
4 | 20  | 1  | 2 
5 | 21  | 0  | - 
6 | 12  | 1  | 1 
... 

Так у меня есть рабочий код, но я думаю, что это должно быть закодировано лучше, но я понятия не имею, как это сделать.

код в контроллере:

$this->paginate = [ 
     'contain' => ['ExampleTableA', 'ExampleTableB'] 
]; 
$query = $this->Users->find('all')->order(['Users.first_name'=>'ASC', 'Users.last_name'=>'ASC']); 

// Extending Group  
$query->formatResults(function (\Cake\Datasource\ResultSetInterface $results) { 
    return $results->map(function ($row) { 
     if($row['active'] != 1){ 
      $row['group'] = '-'; 
     } 
     else{     
      $query_active = $this->UserParticipants->find('list', array('fields' => array('Users.id'))) 
      ->where(['Users.active' => 1]) 
      ->order(['Users.rating' => 'ASC','Users.id' => 'ASC']);     

      $array = $query_active->toList(); 
      $length = $query_active->count(); 

      $firsthalf = array_slice($array, 0, $length/2); 
      $secondhalf = array_slice($array, $length/2);     

      if(in_array($row['id'], $firsthalf)){ 
       $row['group'] = 1; 
      } 
      if(in_array($row['id'], $secondhalf)){ 
       $row['group'] = 2; 
      }     
     } 
     return $row; 
    }); 
}); 

$userParticipants = $this->paginate($query); 

Проблема с моим Кодекса, что $query_active искатель будет выполняться столько, сколько существует пользователей. Я не могу использовать какие-либо опции в функции карты. Этот пример Код исходит отсюда: Adding Calculated Fields

У вас есть какие-либо улучшения или намеки?

ответ

1

У меня нет понятия о тёмных костях. Но я думаю, что вы можете переместить вычисления $firsthalf и $secondhalf из анонимной функции.

$this->paginate = [ 
     'contain' => ['ExampleTableA', 'ExampleTableB'] 
]; 
$query = $this->Users->find('all')->order(['Users.first_name'=>'ASC', 'Users.last_name'=>'ASC']); 

$query_active = $this->UserParticipants->find('list', array('fields' => array('Users.id'))) 
    ->where(['Users.active' => 1]) 
    ->order(['Users.rating' => 'ASC','Users.id' => 'ASC']); 

$array = $query_active->toList(); 
$length = $query_active->count(); 
$firsthalf = array_slice($array, 0, $length/2); 
$secondhalf = array_slice($array, $length/2); 

// Extending Group  
$query->formatResults(function (\Cake\Datasource\ResultSetInterface $results) use ($firsthalf, $secondhalf) { 
    return $results->map(function ($row) use ($firsthalf, $secondhalf) { 
     if($row['active'] != 1){ 
      $row['group'] = '-'; 
     } 
     else{     
      if(in_array($row['id'], $firsthalf)){ 
       $row['group'] = 1; 
      } 
      if(in_array($row['id'], $secondhalf)){ 
       $row['group'] = 2; 
      }     
     } 
     return $row; 
    }); 
}); 

$userParticipants = $this->paginate($query); 
+0

Это также то, что моя первая попытка была, но потом я получаю неопределенную переменную на этой линии, когда я отладки переменную – Yddap17

+0

@ Yddap17 какую переменную? Какая линия? Проходили ли вы переменные с помощью 'use ($ firsthalf, $ secondhalf)'? –

+0

Я не пробовал его с помощью 'use', но когда я пытаюсь перечислить переменные' $ firsthalf' и '$ secondhalf' в' '' '', то нулевые – Yddap17

 Смежные вопросы

  • Нет связанных вопросов^_^