У меня есть таблица, в которой указаны пользователи. Там у нас есть поля 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
У вас есть какие-либо улучшения или намеки?
Это также то, что моя первая попытка была, но потом я получаю неопределенную переменную на этой линии, когда я отладки переменную – Yddap17
@ Yddap17 какую переменную? Какая линия? Проходили ли вы переменные с помощью 'use ($ firsthalf, $ secondhalf)'? –
Я не пробовал его с помощью 'use', но когда я пытаюсь перечислить переменные' $ firsthalf' и '$ secondhalf' в' '' '', то нулевые – Yddap17