CakePHP中的数据库选择列表?

时间:2011-10-04 21:11:34

标签: sql database-design cakephp

我正在为精神卫生机构设计数据库,临床医生可以从许多类别(就业状况,住房状况,关系状态等)的预先格式化选项列表中进行选择。在数据库中,我们使用了类似于stackoverflow here中描述的选择列表,以避免为每个列表创建表。

我们计划使用CakePHP作为新构建的框架,我担心CakePHP的“自动化”保存和显示数据的能力很难与使用选择列表结构的数据库很好地协同工作。我正在考虑为每个列表创建一个单独的表来利用CakePHP的自动化。

有没有人有经验在CakePHP中实施选择列表或有关于替代设计方法的建议?

编辑:我正在尝试使用两个表来实现它 -

value_lists                     list_values
-----------             -------------------------------
id | list_name          id | list_value | value_list_id   

这是我的型号代码:

<?php
class BirthplaceCounty extends AppModel {
var $name = 'BirthplaceCounty';
//The Associations below have been created with all possible keys, those that are not needed can be removed
var $useTable = 'list_values';
var $displayField = 'list_value';
var $hasMany = array(
    'Registration' => array(
        'className' => 'Registration',
        'foreignKey' => 'birthplace_county_id',
        'dependent' => false,
        'conditions' => array('BirthplaceCounty.value_list_id' => '8'),
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'exclusive' => '',
        'finderQuery' => '',
        'counterQuery' => '',
    )
);

}

我的问题似乎是无论我尝试什么条件 -

 $this->BirthplaceCounty->find('list');
   or
 $this->BirthplaceCounty->find('all');

始终返回list_values中的所有记录。 CakePHP正在生成的SQL是

SELECT `BirthplaceCounty`.`id`, `BirthplaceCounty`.`list_value` 
FROM `list_values` AS `BirthplaceCounty` WHERE 1 = 1

无论我如何更改条件,WHERE子句始终为1 = 1.如何正确编写条件?

编辑2:好的 - 我意识到$ hasMany变量中的设置条件不会影响find()函数。我创建了一个有效的新功能。

function getActual() {      
    $conditions = array('BirthplaceCounty.value_list_id = 5');      
    return $this->find('list', compact('conditions'));
}

通过重载find()函数是唯一的方法吗?

2 个答案:

答案 0 :(得分:1)

我没有看到使用CakePHP有任何问题。我知道@Anh Pham说它可能“非常麻烦”,但老实说,如果你的网站比博客教程稍微复杂一点,几乎所有与数据库相关的东西都会成为Cake的麻烦。

Cake是我选择的PHP框架,但我相信你必须暂时使用它并尝试理解“魔法”是如何工作的。当你这样做时,更容易决定你应该让Cake自己处理一些数据库操作,以及如何欺骗它以优雅的方式做你想做的事情。

可以使用“选择列表”结构与Cake的模型关联很好地结合,只需在声明关联时添加正确的conditionsforeignKey即可。

<强>更新

我可以从最新的编辑中看到你走在正确的轨道上。我相信您现在明白为什么您的$this->BirthplaceCounty->find('list')调用返回整个表:模型不知道您想要按value_list_id = 5(5或8?)过滤,该条件仅适用于其关联与其他模特。

无论如何,除了重载find()之外还有其他选项:您可以在模型的beforeFind回调中定义默认条件,如下所示:

function beforeFind($queryData) {
    $defaultConditions = array("BirthplaceCounty.value_list_id = 5");
    if(!empty($queryData['conditions'])) {
        // Make sure 'conditions' is an array, so we can array_merge
        $queryData['conditions'] = is_array($queryData['conditions']) : $queryData['conditions'] : array($queryData['conditions']);
        // Merge conditions passed to find with the default
        $queryData['conditions'] = array_merge($defaultConditions, $queryData['conditions']);
    } else {
        $queryData['conditions'] = $defaultConditions;
    }
    // Return the modified $queryData to be used by find
    return $queryData;
}

答案 1 :(得分:0)

创建单独的表将是Cake的做法。做另一种方式会非常麻烦。

为了保持较低的开销,您可以在here中使用ArraySource,这样您就不必查询数据库中的这些内容,同时仍然可以方便地使用模型。