cakephp 3.0 如何用值而不是 id 填充 select 字段

cakephp 3.0 how to populate a select field with values instead of id

我一直在寻找以前的答案,但我找到的答案与旧的 cakephp 版本有关

我有两个 tables,'magazines' 和 'issues' 其中有关系 'issues' BelongsTo 'magazines',这就是 IssuesTable 的样子:

public function initialize(array $config){

$this->belongsTo('Magazines', [
    'foreignKey' => 'id'
]);
}

table 杂志有两个字段,magazines.id 和 magazines.name

table 问题有两个字段,issues.id,issues.magazine_id 其中 issues.magazine_id 是外键

为了在问题视图中使用 magazine.name 值填充 select 输入并保存 issues.magazine_id,我已将控制器设置为这样

$this->set('magazines', $this->Issue->Magazine->find('list'));

然后我在问题视图中添加了以下代码add.cpt

    <?php
    echo $this->Form->input('name', [
    'type' => 'select',
    'multiple' => false,
    'options' => $magazines, 
    'empty' => true]);
    ?>

但我得到的输入 select 的值是 issues.magazine_id 而不是 magazines.name

感谢您的帮助和评论

您想使用 find('list'),因为这将 return 主键和显示字段:-

$this->set(
    'magazines', 
    $this->Issues->Magazines->find('list')
);

然后在你的表单中,如果你想为关联设置外键,你需要输入名称 magazine_id:-

echo $this->Form->input(
    'magazine_id', 
    [
        'type' => 'select',
        'multiple' => false,
        'options' => $magazines, 
        'empty' => true
    ]
);

有关详细信息,请参阅 docs

更新

如果您在使用 find('list') 时遇到问题,可能是因为您的模型的 displayField 设置不正确。 Cake 通常会在初始化时确定模型的 displayField。如果这不起作用,或者您想要一个不同的字段,您可以在模型的 initialize() 方法中手动设置它。 例如:-

class MagazinesTable extends Table
{

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

正在将 'name' 更改为适当的字段。

或者,您可以选择 Cake 将哪个字段用于 return 由 find('list') 编辑的值(这在您想要覆盖默认值 displayField 时特别有用)。 例如:-

$this->Issues->Magazines->find('list', [
    'keyField' => 'id',
    'valueField' => 'name'
]);

在月份助手中显示所选选项

$this->Form->month('students.month', [
'label' => false, 
'value'=>date('m'),
'required'=>true
]); 

这实际上帮助了我。

$this->Issues->Magazines->find('list', [
   'keyField' => 'id',
   'valueField' => 'name'
]);