使用paginator排序CakePHP中的自定义查询数据进行排序

时间:2016-06-13 09:19:05

标签: php mysql arrays sorting cakephp

我的控制器查询如下:

$built_arr = $this->User->query("SELECT u1.id,
                                 CASE WHEN u1.role = 'CW' THEN u2.agency_name
                                 WHEN u3.role = 'EU' THEN u2.agency_name ELSE u1.agency_name END AS agency
                                 FROM users u1 LEFT JOIN users u2 ON (u1.parent = u2.id AND u2.role = 'A')
                                 LEFT JOIN users u3 ON (u1.id = u3.parent AND u1.role = 'CW') 
                                 LEFT JOIN users u4 ON (u1.parent = u4.id AND u4.role = 'A') 
                                 WHERE u1.role = 'A' OR u1.role = 'CW'
                                 GROUP BY u1.id");

此查询的数组代码如下:

if (isset($built_arr) && !empty($built_arr)) {
        foreach ($built_arr AS $key => $value) {
            if (isset($value[0]['agency']) && !empty($value[0]['agency'])) {
                $agency_arr[$value['u1']['id']] = $value[0]['agency'];
            }
        }
}

现在我已将此数据设置为如下所示:

$this->set('agency_arr', $agency_arr);

现在这个数组(agency_arr),我已经在视图页面中用作表格列的数据。 现在我想用这个数组数据对该列进行排序。 我的观看代码如下:

<th><?php echo $this->Paginator->sort('?', __("Agency Name"), array('escape' => false)); ?></th>

对“?”的建议标志。 我必须写什么而不是“?”,所以我可以用我的数组数据排序。 我的其他列的数据来自分页查询,所以这些工作正常。 我需要对额外列进行额外查询,因此需要按该列进行排序。

1 个答案:

答案 0 :(得分:0)

对排序问题:

Cake \ View \ Helper \ PaginatorHelper :: sort($ key,$ title = null,$ options = [])     参数:

    $key (string) – The name of the column that the recordset should be sorted.
    $title (string) – Title for the link. If $title is null $key will be used for the title and will be generated by inflection.
    $options (array) – Options for sorting link.

所以我想这就是你想要的:$ paginator-&gt; sort('agency_name','Agency Name',array('escape'=&gt; false));

如果您还没有,我建议您正确设置关联,并使用包含查找调用。 由于有父母我猜它是一个HasAndBelongsToMany关系。 (孩子有多个父母和父母多个孩子)

CREATE TABLE `users` ( 
user_id int NOT NULL AUTO_INCREMENT PRIMARY KEY, 
role varchar(255), 
);

CREATE TABLE `childrens_parents` ( 
childrens_parents_id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
parent_id int, 
children_id int, 
FOREIGN KEY (u1_id) REFERENCES users(user_id), 
FOREIGN KEY (u2_id) REFERENCES users(user_id) 
);

在您的Model / UsersTable中正确设置关联,如中所述 cakephp书 (别忘了targetforeignkey + foreignkey)

现在你可以这样做:

$query = $this->Users->find()->where(['role'=>'A'])->orWhere(['role'=>'CW'])->contain([
    'Children' => function ($q) {
       return $q
            ->where(['Role =' => 'CW']);
    }
])->contain([
    'Parents' => function ($q) {
       return $q
            ->where(['Role =' => 'A']);
    }
])->group('user_id');

现在,您可以对结果集进行分页,访问对象的所有字段。

foreach($query as $row) {
    debug($row);//see how nicely the resultarray is looking
    echo($row->Parents[0]->user-id);// access  related Entities
}

如果它不是HABTM但有很多或其他类型,你可以很容易地适应它。 我强烈建议举办蛋糕大会!

Ressources(我建议阅读整篇文章以获得正确的cakephp工作): http://book.cakephp.org/3.0/en/orm/query-builder.html http://book.cakephp.org/3.0/en/orm/associations.html