Cakephp 3.0如何使用数据库值而不是数字索引

时间:2016-02-01 11:00:07

标签: php cakephp cakephp-3.0

如何从数据库表填充cakephp3中的选择下拉列表。

目前,Cakephp生成一个数字索引的数组(选项列表)。

选项值应具有数据库记录的id(不应该是Cakephp生成的数字键)

部门(表)是对事件进行分类的分类。 应存储基于部门的事件列表的事件(表)。

某个事件可能属于许多部门。我如何实现这一目标?

EventsController.php

<?php $department_results = $connection->execute('SELECT departmentname FROM department')->fetchAll('assoc'); // list of departments
$this->set('departmentvalues', $department_results ); 

事件:add.ctp

<?php echo  $this->Form->input('department', array('label' => false,
                                               'div' => false,
                                               'type' => 'select',
                                               'multiple'=>'checkbox',
                                               'legend' => 'false',
                                               'options' => $departmentvalues,
                                               'empty' => 'Please select a Department'
                                                 ));

目标: 使用数据库中的值的选择下拉列表,选项值应该是数据库记录的id

预期结果:

&#13;
&#13;
<select name="department"><option value="2">Maths</option><option value="4">Physics</option></select>
&#13;
&#13;
&#13;

问题: cakephp生成数字索引的选项数组。

&#13;
&#13;
<select name="department"><option value="0">Maths</option><option value="1">Physics</option></select>
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:1)

您应该使用CakePHP标准来查询模型,而不是原始SQL,尤其是在简单列表的情况下。

以下内容应该符合您的要求:

$department_results = $this->Departments->find('list')
    ->hydrate(false)
    ->fields(['id','departmentname'])
    ->toArray();
$this->set('departmentvalues', $department_results);

请注意,您需要包含已命名列departmentname的字段。默认情况下,find('list')应返回idname字段。

答案 1 :(得分:1)

另一种选择是以这种方式设置 displayField : `class DepartmentsTable扩展了表{

public function initialize(array $config) {
    parent::initialize($config);
    $this->displayField('departmentname');
}

}` 在控制器中,您可以通过这种方式调用方法find('list'):

 $departments=  TableRegistry::get("Departments");
     $departmentvalues=$departments->find('list')
                              ->hydrate(false)
                              ->toArray();
$this->set('departmentvalues', $department_results);