6

有没有办法将 $this->find('all') 数组格式化为视图中的 $this->find('list') ?我问的原因是我可以将该新数组传递给表单助手选项,然后使用 $this->find('all') 数组来构建我需要的一些额外的东西?

Array ( 
[0] => Array ( [School] => Array ( [id] => 0 [name] => Nature [address] => 112 Main [max_students] => 25 [application_level] => 5 ) ) 
[1] => Array ( [School] => Array ( [id] => 1 [name] => Math [address] => 112 Smith [max_students] => 25 [application_level] => 0 ) ) 
[2] => Array ( [School] => Array ( [id] => 2 [name] => Art [address] => 112 Lane [max_students] => 25 [application_level] => 0 ) ) 
)

所以这是我在执行 find('all') 时得到的数组。我想构建数组,使其看起来像:

Array (
[0] => 'Nature'
[1] => 'Math'
[2] => 'Art'
)

这通常由 $this->find('list') 函数完成。虽然我想要整个数组的原因是因为我需要将 application_level 添加到 $this->Form->input() 函数中。这是因为我需要添加附加应用程序级别的类选项,所以我只显示基于先前选择的应用程序级别的节目。

编辑:我不能只做 $this->find('list', [insert parameters here?]); 吗?我只是不明白您如何设置附加参数?

4

3 回答 3

7

如果您的查询不是过于复杂并且不会返回过多的结果,只需运行两次(一次用于查找全部,一次用于查找列表)。

查找所有,首先列出所有与您传入的参数相同的内容。例如:

$this->Model->find('all', array(
    'conditions' => array(
        'field' => 500,
        'status' => 'Confirmed'
    ),
    'order' => 'id ASC'
));

...您从字面上替换alllist. 在你的情况下,可能最容易做两次,每次一次。像这样:

$parameters = array(
    'conditions' => array(
        'field' => 500,
        'status' => 'Confirmed'
    ),
    'order' => 'id ASC'
);

$alldata = $this->Model->find('all', $parameters);
$listdata = $this->Model->find('list', $parameters);

否则,您可以遍历它并填充您自己的列表:

$list = array();

foreach($findall as $row) {
    $id = $row['id'];
    $name = $row['name'];
    $list[$id] = $name;
}

$this->set('listdata', $list);

对您的问题的简短回答是,没有快速、简单的方法可以从同一个查询中进行选择all list但是您可以通过将参数(条件、顺序等)作为预定义数组传递或填充您自己的列表来重新使用它们。

于 2013-11-12T03:41:54.440 回答
5

使用 CakePHP 的 hash 实用程序从 find('all') 的结果中创建格式为 find('list') 的结果的替代答案:

//where $data is the result of find all
App::uses('Hash', 'Utility');
$ids = Hash::format($data, array('{n}.Model.id'), '{0}'); //ids in an array.
$names = Hash::format($data, array('{n}.Model.name'), '{0}'); //names in an array
$dataAsList = array_combine($ids, $names);
于 2013-11-12T20:19:07.797 回答
2

改进凯的答案。Hash 类有一个叫做 combine 的方法,它可以在一行中完成你想要做的事情

$list = Hash::combine($data,'{n}.Model.id','{n}.Model.name');

$list将是一个平面数组,类似于来自的数据find('list')

于 2015-04-29T11:10:59.707 回答