我已经在 CakePHP 中构建了相当多的具有编辑(更新)功能的应用程序。我遇到了一个我以前没有遇到过的问题,即使数据从数据库返回并且字段名称匹配,Cake 也没有填充一组表单字段。
在控制器方法中,我正在获取数据:
public function edit()
{
$invno = '1234'; // This is dynamic from the URL but is here for the example
$TblInvoicestobepaid = TableRegistry::getTableLocator()->get('TblInvoicestobepaid');
$data = $TblInvoicestobepaid->find()->where(
['invno' => $invno]
);
if (!$data->isEmpty()) {
$data = $data->first();
}
}
如果我这样做,debug($data);
我可以看到数据正在从数据库返回并且是一个对象:
object(App\Model\Entity\TblInvoicestobepaid) {
'invno' => '1234',
'amount' => '1090',
'vat' => '218',
'total' => '1308',
'orgname' => 'Test Company',
}
然后我习惯$this->set(compact('data'));
将这些数据传递给我的模板。这似乎与其他控制器edit()
方法相同,包括那些已经烘焙的方法。
我正在使用表单助手并且字段名称与上面对象中的键匹配,例如
<?php echo $this->Form->create(); ?>
<?php echo $this->Form->text('invno'); ?>
<?php echo $this->Form->text('amount'); ?>
<?php echo $this->Form->text('vat'); ?>
<?php echo $this->Form->text('total'); ?>
<?php echo $this->Form->text('orgname'); ?>
<?php echo $this->Form->end(); ?>
表单已呈现,但字段为空。
我确实注意到的一件事是,这是一个遗留应用程序,并且从中获取此数据的表没有id
字段。主键是invno
,这是一个字符串(varchar
在 MySQL 中)。但这已在 Table 类中定义:
// src/Model/Table/TblInvoicestobepaidTable.php
public function initialize(array $config)
{
parent::initialize($config);
$this->setTable('tbl_invoicestobepaid');
$this->setDisplayField('invno');
$this->setPrimaryKey('invno');
}
add()
我通过控制器中的方法插入数据没有任何问题。但是当涉及到编辑时,它并没有填充表单,我不明白为什么。
CakePHP 版本是 3.8.12