cakephp 3.0如何使用值而不是id填充选择字段

Rau*_*ala 9 php cakephp cakephp-3.0

我正在寻找以前的答案,但我发现的那些与旧的cakephp版本有关

我有两个表,'杂志'和'问题',其中有'问题'属于'杂志'的关系,这就是IssuesTable的样子:

public function initialize(array $config){

$this->belongsTo('Magazines', [
    'foreignKey' => 'id'
]);
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

$this->set('magazines', $this->Issue->Magazine->find('list'));
Run Code Online (Sandbox Code Playgroud)

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

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

但我得到输入选择与issues.magazine_id作为值而不是magazines.name

感谢您的帮助和评论

drm*_*nja 18

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

$this->set(
    'magazines', 
    $this->Issues->Magazines->find('list')
);
Run Code Online (Sandbox Code Playgroud)

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

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

有关详细信息,请参阅文档.

更新

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

class MagazinesTable extends Table
{

    public function initialize(array $config)
    {
        $this->displayField('name');
    }
}
Run Code Online (Sandbox Code Playgroud)

更改'name'到相应的字段.

或者,您可以选择Cake将用于返回值的字段find('list')(当您要覆盖默认值时,这尤其有用displayField).例如: -

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