0

我有一个使用 Bake 创建的视图,该视图具有以下内容:

<fieldset>
    <legend><?php echo __('Edit Device'); ?></legend>
<?php
    echo $this->Form->input('DeviceID');
    echo $this->Form->input('DeviceTypeID');
    echo $this->Form->input('UserID');
    echo $this->Form->input('Type');
    echo $this->Form->input('KeyPadID');
    echo $this->Form->input('Version');
    echo $this->Form->input('Description');
    echo $this->Form->input('UpdateID');
?>
</fieldset>

保存到表中:

CREATE TABLE `device` (
    `DeviceID` VARCHAR(255) NOT NULL ,
    `DeviceTypeID` INT(11) NOT NULL ,
    `UserID` INT(10) NOT NULL ,
    `Type` VARCHAR(10) NULL DEFAULT NULL ,
    `KeyPadID` INT(10) NULL DEFAULT NULL ,
    `Version` VARCHAR(255) NULL DEFAULT NULL ,
    `Description` TINYBLOB NULL ,
    `UpdateID` INT(11) NULL DEFAULT NULL ,
    PRIMARY KEY (`DeviceID`),
    INDEX `FK_USER` (`UserID`),
    INDEX `FK_devices_updates` (`UpdateID`),
    INDEX `FK_device_devicetype` (`DeviceTypeID`),
    CONSTRAINT `FK_device_devicetype` FOREIGN KEY (`DeviceTypeID`) REFERENCES `devicetype` (`DeviceTypeID`),
    CONSTRAINT `FK_devices_updates` FOREIGN KEY (`UpdateID`) REFERENCES `update` (`ID`) ON UPDATE CASCADE ON DELETE CASCADE,
    CONSTRAINT `FK_USER` FOREIGN KEY (`UserID`) REFERENCES `user` (`UserID`) ON UPDATE CASCADE ON DELETE CASCADE
)

我的问题是,当显示表单时,它显示 DeviceTypeID 和 UserID 以及 UpdateID 作为外键值,而不是下拉菜单,标题是文本,值是 ID 列。我将如何将外部表中的字段设置为显示字段并将 id 设置为值?

4

1 回答 1

2

2013 年 11 月 2 日更新

首先,我强烈建议相应地转换您的主键和外键,以便它们符合 CakePHP 命名约定。

这意味着:

  • DeviceID应该是id
  • DeviceTypeID应该device_type_id
  • UserID应该user_id

此外,表中的所有主键都应命名为id. 这样,您将永远不必担心任何关于您的模型等的事情。

之后,您的所有表格都必须是复数形式。这意味着devicetable 应该是devices,所以你也应该重命名它。我假设您还有以下表格:devices_typesusers.

在这一点上,我应该注意到我更喜欢有一个名为devicetype. 我避免使用下划线的名称,因为为每个对象、类等使用正确的形式很容易出错。所以我不必担心是否应该使用 CamelCase。

反正

你的Device模型应该是这样的:

<?php
/** Device.php **/
class Device extends AppModel {
    public $name = 'Device';
    public $belongsTo = array(
        'DeviceType' => array(
            'className' => 'DeviceType',
            'foreignKey' => 'device_type_id'
            /** Specify other keys that meet your needs **/
        ),
        'User' => array(
            'className' => 'User',
            'foreignKey' => 'user_id'
        )
    );
};
?>

您的DeviceType模型也应该类似于

<?php
/** DeviceType.php **/
class DeviceType extends AppModel {
    public $name = 'DeviceType';
};

在您的edit()方法中,您应该DeviceType像这样查询您的:

...
$devicetypes = $this->Device->DeviceType->find('list', array('id', 'caption'));
$this->set(compact('devicetypes'));
...

这样,在您的视图中,相应的表单元素会<select>正确设置菜单。

PS:您应该遵循关于模型命名等的 CakePHP 约定......我的只是一个例子。

于 2013-02-06T13:39:11.187 回答