CakePHP格式查找视图中的('all')到('list')?

k97glaaz  于 2023-03-12  发布在  PHP
关注(0)|答案(4)|浏览(68)

有没有办法将$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()函数中。这是因为我需要添加class选项并附加应用程序级别,所以我只显示基于先前选择的应用程序级别的节目。
编辑:我不能只做$this-〉find('list',[在这里插入参数?]);?我只是不明白您是如何设置附加参数的?

iaqfqrcu

iaqfqrcu1#

如果您的查询不是太复杂,也不会返回过多的结果,那么只需运行两次(一次用于查找全部,一次用于查找列表)。
查找所有、列表、第一个、根据您传入的参数相同的内容。例如:

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

......您可以将all替换为list。在您的情况下,最简单的方法可能是执行两次,每次一次。如下所示:

$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);

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

tct7dpnv

tct7dpnv2#

使用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);
rjjhvcjd

rjjhvcjd3#

为了改进kai的答案,Hash类有一个名为合并的方法,它可以在一行代码中完成您要做的事情

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

$list将是类似于来自find('list')的数据的平面阵列;

g2ieeal7

g2ieeal74#

在CakePHP 3和4中,你可以做以下事情:

$tags = $this->tags->find()->all();
$tagOptions = $tags->combine('id', 'name');

参见:

  • CakePHP手册中的使用集合构建选项。

相关问题