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
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?
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
@ Yddap17 welche Variable? Welche Linie? Haben Sie die Variablen mit 'use ($ firsthalf, $ secondhalf)' durchgelesen? –
Ich habe es nicht mit 'use' versucht, aber wenn ich versuche, die' $ firsthalf' und '$ secondhalf' Variablen im' else' Teil sind null – Yddap17