Cakephp 3使用contains时的动态限制参数

时间:2017-11-10 11:26:20

标签: sorting cakephp cakephp-3.0 limit

CakePHP版本3.5.5

我的最终目标是为用户提供通过索引视图上的选择列表更改显示结果量的功能。另外,我需要按area_name asc。

对初始页面加载进行排序

//我做了什么

我改变了规定限制参数的位置,可以在下面看到。

// AREAS CONTROLLER 

public $paginate = [
    'sortWhitelist' => [
       'Areas.area_name', 'Users.first_name', 'Users.last_name'
    ]
    //'limit' => 1, // REMOVED FROM HERE
    //'order' => [ // REMOVED FROM HERE
        //'Areas.area_name' => 'asc'
    //]
];

public function index()
{
    $query = $this->Areas->find('all')        
        ->contain([
            'Users'
        ])
        ->where(['Areas.status' => 1]);

    $limit = 1;
    $this->paginate = [
        'order' => ['Areas.area_name' => 'asc'], // ADDED HERE
        'limit' => $limit // ADDED HERE
     ];        

     $this->set('areas', $this->paginate($query));
}

我宣布分页链接如:

// AREAS INDEX VIEW

<?= $this->Paginator->sort('Areas.area_name', __('Area Name')) ?>
<?= $this->Paginator->sort('Users.first_name', __('First Name')) ?>
<?= $this->Paginator->sort('Users.last_name', __('Last Name')) ?>

//结果

上面的代码适用于不使用包含的应用程序中的所有索引方法,但是当我在这里实现此解决方案时,所有工作除了我无法对关联数据进行排序 - IE:用户优先和姓氏?

=============================================== ==========================

我做了什么

//尝试1

我在public $ paginate类上面添加了一个初始化方法,如:

public function initialize()
{
    $limit = 1;      
}

public $paginate = [
    'sortWhitelist' => [
        'Areas.area_name', 'Users.first_name', 'Users.last_name'
    ]
    'limit' => $limit,
    'order' => [
        'Areas.area_name' => 'asc'
    ]
];

public function index()
{
    $query = $this->Areas->find('all')        
        ->contain([
            'Users'
        ])
       ->where(['Areas.status' => 1]);

    $this->set('areas', $this->paginate($query));
}

我的观点也是如此。

//尝试1的结果

语法错误,意外''限制''(T_CONSTANT_ENCAPSED_STRING),在第36行期待']''限制'=&gt; $限制,

=============================================== ==========================

//尝试2

我尝试将limit参数和order数组添加到查询中,如:

public function index()
{
    $limit = 1;
    $query = $this->Areas->find('all')        
        ->contain([
            'Users'
        ])
        ->where(['Areas.status' => 1])
        ->order(['Areas.area_name' => 'asc'])            
        ->limit($limit);

     $this->set('areas', $this->paginate($query));

}

//尝试2的结果

结果集未按area_name排序,不限于1个结果。

=============================================== ==========================

//尝试3

然后我更改了查询并尝试了以下操作,看看我是否可以获得动态限制:

$limit = 1;
$query = $this->Areas->find('all') 
    ->contain('Users', function ($q) {
        return $q
        //->order('Areas.area_name' => 'asc'),
        ->limit($limit);
    })
    ->where(['Areas.status' => 1]);

    $this->set('areas', $this->paginate($query));

//尝试3的结果

结果集不限于1个结果。

=============================================== ==========================

其他信息

// USERS TABLE

$this->hasOne('Areas', [
    'foreignKey' => 'user_id'
]);

// AREAS TABLE

$this->belongsTo('Users', [
    'foreignKey' => 'user_id',
    'joinType' => 'INNER'
]);

我搜索了以下食谱部分(分页,查询生成器,检索数据和结果集和关联 - 将表连接在一起),但我找不到一种方法来使这个工作,所以任何帮助将不胜感激。< / p>

非常感谢。 ž。

1 个答案:

答案 0 :(得分:2)

您正在覆盖index()方法中的$this->paginate['order'] = ['Areas.area_name' => 'asc']; $this->paginate['limit'] = $limit; 媒体资源,因此包括白名单在内的设置正在丢失。

直接设置密钥:

scale_y_continuous