2017-02-08 4 views
0

Ich habe eine Tabelle, in der Benutzer aufgeführt sind. Dort haben wir die Felder ID, Bewertung, aktiv. So könnte ein Beispiel sein:Erstellen schwierig berechnete Felder in 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  | 
... 

Mein Ziel ist es, die Felder mit einem anderen berechneten Gruppenfeld zu erweitern. Ich erwarte 3 Benutzergruppen.

  • Diejenigen, die eine „0“ im aktiven Bereich haben bekommen ein „-“ in Gruppenfeld

Das ist das leicht und die Nutzer mit „1“ im aktiven Bereich war, wird zwei goups erhalten zugewiesen.

  • Die „bessere“ Hälfte der Nutzer mit einer besseren Bewertung wird ein 1 in Gruppenfeld
  • Die „schlechter“ die Hälfte der Nutzer mit einer schlechteren Bewertung erhält
ein 2 in Gruppenfeld erhalten

die letzte berechnete Tabelle sollte so aussehen wie

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 
... 

Also habe ich einen funktionierenden Code, aber ich denke, das ist besser codiert werden müssen, aber ich habe keine Ahnung, wie.

-Code in Controller:

$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); 

Das Problem mit meinem Code ist, dass die $query_active finder so viele ausgeführt werden als Benutzer vorhanden sind. Ich kann keine Optionen in die Kartenfunktion einfügen. Dieser Beispielcode kommt von hier: Adding Calculated Fields

Also haben Sie irgendwelche Verbesserungen oder Hinweise?

Antwort

1

Ich habe keine Ahnung von CakePHP. Aber ich denke, Sie sollten in der Lage sein, die Berechnung von $firsthalf und $secondhalf aus der anonymen Funktion zu verschieben.

$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

Das ist auch das, was mein erster Versuch war, aber dann bekomme ich eine undefinierte Variable in dieser Zeile, wenn ich die Variable debuggen – Yddap17

+0

@ Yddap17 welche Variable? Welche Linie? Haben Sie die Variablen mit 'use ($ firsthalf, $ secondhalf)' durchgelesen? –

+0

Ich habe es nicht mit 'use' versucht, aber wenn ich versuche, die' $ firsthalf' und '$ secondhalf' Variablen im' else' Teil sind null – Yddap17