与hasMany关系中的Paginate相关数据

punde 发布于 2019-03-09 cakephp 最后更新 2019-03-09 14:37 3 浏览

尝试在hasMany关系中分页相关数据时遇到了一些麻烦 我有两个模型 - 集合和项目 集合hasMany Item 项目属于收藏 在Collection view.ctp中,它显示了正在传递的ID的收集细节以及Items的相关数据。它从查找“第一次”呼叫接收这些数据。

$this->set('collection', $this->Collection->find('first', $options));
结果数组看起来像:
array(
    'Collection' => array(
        'id' => '4fc923f5-0a58-453f-9507-0c0c86106d80',
        'name' => '<collection_name>'
    ),
'Item' => array(
        (int) 0 => array(
            'id' => '4fc92403-000c-4ed2-9dae-0c0c86106d80',
            'name' => 'Item1'
        ),
        (int) 1 => array(
            'id' => '4fc9241b-35ec-4810-b511-0c0c86106d80',
            'name' => 'Item2'
        ),
        (int) 2 => array(
            'id' => '4fc96e5d-ad74-4c05-a9da-0c0c86106d80',
            'name' => 'Item3'
        ),
        (int) 3 => array(
            'id' => '4fc96e64-a110-4036-bea2-0c0c86106d80',
            'name' => 'Item4'
        )
    )
现在我可以从这个分页调用中获得相同的结果,除了添加了0索引
$this->set('items', $this->paginate('Collection', array('Collection.id'=>$id)));
array(
    (int) 0 => array(
'Collection' => array(
            'id' => '4fc923f5-0a58-453f-9507-0c0c86106d80',
            'name' => '<collection_name>'
        ),
'Item' => array(
            (int) 0 => array(
                'id' => '4fc92403-000c-4ed2-9dae-0c0c86106d80',
                'name' => 'Item1'
            ),
            (int) 1 => array(
                'id' => '4fc9241b-35ec-4810-b511-0c0c86106d80',
                'name' => 'Item2'
            ),
            (int) 2 => array(
                'id' => '4fc96e5d-ad74-4c05-a9da-0c0c86106d80',
                'name' => 'Item3'
            ),
            (int) 3 => array(
                'id' => '4fc96e64-a110-4036-bea2-0c0c86106d80',
                'name' => 'Item4'
            )
      )
  )
);
我可以对返回的数组执行array_shift,但是分页不起作用。我可以尝试为此创建一个自定义分页函数,但想知道是否有一个简单的方法来使用我使用的标准分页,因为它有我想要的数据,只是额外的第一个数组父元素[0]。 在此先感谢您的任何建议。
已邀请:

punde

赞同来自:

<?php
// Don't pull in child data, we'll fetch that manually.
$this->Collection->contain(); // Assuming you have this behavior.
// Get the collection.
$collection = $this->Collection->find('first', $options);
// Conditions
$this->paginate['Item'] = array(
    'conditions' => array(
        'Item.collection_id' => $collection['Collection']['id'];
    )
);
// Get the items
$items = $this->paginate('Item');
// Return to original child model structure.
array_walk($items, function(&$v) { // Anonymous functions requires PHP 5.3
    $v = $v['Item'];
});
// Add it to the collection array.
$collection['Item'] = $items;
?>
这就是我在子模型上实现分页的方式。试一试,也可能适合你。 -一个