2

我在尝试对 hasMany 关系中的相关数据进行分页时遇到了一些麻烦

我有两个模型 - Collection 和 Item Collection hasMany Item Item belongsTo Collection

在 Collection view.ctp 中,它显示了正在传递的 ID 的集合详细信息以及项目的相关数据。它从 find “first” 调用中接收此数据。

$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]。

在此先感谢您的任何建议。

4

1 回答 1

2
<?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;

?>

这就是我在子模型上实现分页的方式。试一试,也许对你也有用。

-一种

于 2013-04-11T20:13:31.083 回答