【问题标题】:Creating a lookup field in a CakePHP form在 CakePHP 表单中创建查找字段
【发布时间】:2013-02-06 11:56:02
【问题描述】:

我有一个使用 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 设置为值?

【问题讨论】:

    标签: php cakephp cakephp-2.1


    【解决方案1】:

    2013 年 11 月 2 日更新

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

    这意味着:

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

    表中的所有主键也应命名为id。 这样您就不必担心任何关于您的模型等的事情。

    之后,您的所有表格都必须采用复数形式。这意味着device 表应该是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'));
    ...
    

    这样,在您看来,相应的表单元素会正确设置 &lt;select&gt; 菜单。

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

    【讨论】:

    • +1 表示蛋糕约定。如果这不是根据CakePHP 约定命名表和列的现有数据库,将确保CakePHP 将自动查找数据库表和关系。否则,您必须自己指定要使用的表和外键字段(这可能的,但使用约定可以节省大量时间和可能的问题)
    • 此外,CakePHP 仅正式支持 'auto number' 和 'guid' (char36)) 列作为主键。手动输入主键可能不起作用,因为 CakePHP 将尝试查找具有该 ID 的现有记录并“停止”保存,因为找不到它; book.cakephp.org/2.0/en/getting-started/…
    • @thaJeztah 我现在创建了自动增量列,以确保它们不会给我带来问题。
    • @chris-sawfish 我按照你的建议做了。现在我得到 Error: Call to a member function find() on a non-object File: D:\wamp\www\meaadmin\Controller\DevicesController.php Line: 78
    • 第 78 行有 $devicetypes = $this-&gt;Device-&gt;DeviceType-&gt;find('list', array('DeviceTypeID', 'Type'));
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-29
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-05
    相关资源
    最近更新 更多