在cakephp 3

时间:2017-02-08 00:30:53

标签: php mysql cakephp cakephp-3.0

我有一个表,其中列出了用户。我们有字段id,rating,active。所以一个例子可能是:

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 个答案:

答案 0 :(得分:1)

我不知道cakephp。但我认为您应该能够将ImageReader$firsthalf的计算移出匿名函数。

$secondhalf