0

原始帖子大部分已解决,请查看 Edit #2 了解我最近的问题

我希望你们很容易理解我想要做什么。我正在使用 cakePHP 开发一个项目,它允许用户在那里记录药物使用情况。无论是酒精、咖啡因还是其他任何东西。当人们添加日志时,他们从下拉列表中选择物质,然后输入他们服用的数量,然后输入他们选择用于测量的单位。

例如,某人可以从下拉列表中选择酒精,然后输入 12 作为剂量,然后输入毫升作为单位。

我一直在努力改进我的数据结构方式,以便当我有很多条目时,很容易将它们塑造成我需要的东西。我将使用这些数据为用户生成图形和图表,但这无关紧要。

我需要帮助找出组织这些数据的最佳方式

我现在的结构是这样的。

我的桌子

drugs
id | drug
1  |  Alcohol

records
id | dose | unit | user_id
2  |  12  |  mL  |   3 

record_drugs
id | record_id | drug_id
4  |     2     |    1

我有这些表同事。所以Drugs是下拉列表中提供的所有可用药物的列表,records是他们可以存储剂量和单位以及其他一些杂项的地方,record_drugs基本上将记录与药物配对。

我遇到的一些问题:

1 . 假设一个用途有多个酒精记录,我制作了一个小脚本,添加了所有酒精剂量,然后向他们显示他们记录的酒精总量。如果我做一个简单的 find(list) 我可以获得药物名称和剂量总量,但我无法获得与药物相关的单位。因为似乎 foreach 语句只支持传递两个变量。

编辑:更多信息 我的发现看起来很复杂,但它所做的是遍历我上面列出的三个表并获取 3 个字段。在数组中是这样显示的

array(
'mL' => array(
    'Alcohol' => '12'
),

然后,在我看来,我尝试在 foreach 中循环这些结果以显示我的数据。

Alcohol: 12 ml

我知道如何格式化并回显变量我只是不知道如何抓取我需要的数组中的三个值,然后将它们放入回显中。

2 . 如果我想配对许多相似类型的药物怎么办。例如,如果我将啤酒、威士忌、朗姆酒添加到列表中。所有这些都在同一个“类别”中,我想将这些类别用于某些功能。


我一直在考虑的一个解决方案是将单位也作为另一个下拉菜单的一部分。然后只有一个单位与药物相关。所以我可能会将我的药物表更改为

drugs
id | drug | unit
1  |Alcohol| mL

但是,这为设置单位的用户留下了没有定制的空间。也许他想用啤酒来衡量,也许他想用啤酒来衡量。


编辑#2


我一直在努力规范我的数据库这是结果布局

records
id | date | title | user_id
1  | Jan  | Title | 1

units
id | unit
1  | mL
2  | l

drugs
id | drug
1  | Alcohol

record_drugs
record_id | drug_id | unit_id | dose
1         | 1       | 2       | 5

//There is a users table, but it is unrelated, and correctly formatted.

几个问题;

  1. 对于上面的前三个表,对于 id 字段。我应该将其命名为“tablename_id”还是仅命名为“id”?

  2. “标题”字段将是用户可以选择输入的标题,如果他们想为条目命名。格式是否正确?

  3. 单位相对值如何工作?

我感谢任何花时间阅读本文的人。当然,我不希望我的问题的完整解决方案刚刚交给我。但是,即使您可以就我的问题的一部分提供提示或意见,那也会对我有很大帮助。

4

1 回答 1

1

关于您的第一个问题,确实foreach只遍历关联数组中的键和关联值,但这可以扩展为遍历查询结果。鉴于查询返回一个列和值的数组,您可以对其进行迭代foreach,然后从列数组中访问每个列名。

$resultFromQuery = array(
    array(
        'columnOne' => 'valueOne',
        'columnTwo' => 'valueTwo'
    ),
    array(
        'columnOne' => 'valueThree',
        'columnTwo' => 'valueFour'
    )
);

然后当你迭代它时:

foreach($resultFromQuery as $result) {
    echo "From this result...\n";
    echo "columnOne: " . $result['columnOne'] . "\n";
    echo "columnTwo: " . $result['columnTwo'] . "\n";
}

您的第二个问题完全取决于这些类别需要什么样的功能。您可以为类别创建一个表,并为每种药物的类别存储一个一对一的外键:

Categories
----------
id INT (primary)  <------+
name VARCHAR(255)        |
                         |
Drugs                    |
-----                    |
id INT (primary)         |
name VARCHAR(255)        |
category_id INT (fk) ----+

另外,我建议您对抽象单位进行更多规范化,以将其抽象到自己的表格中。通过这种方式,您可以存储单位数量(相对于基本单位)并即时执行转换。

units
---------
Id INT AUTO_INCREMENT (primary index)
UnitName VARCHAR(255) NOT NULL (unique index)
UnitRelativeValue DECIMAL NOT NULL

鉴于这种结构,单位也有一个 id,因此您可以存储用户对每种药物的首选单位。

UserDefaultDrugUnit
---------------------
id (primary key)
user_id (foreign key)
drug_id (foreign key)
unit_id (foreign key)

此模式还允许为DefaultDrugUnit具有类似结构的表中的每种药物回退到系统默认值。


编辑(回应您对问题 1 的编辑)

要遍历多维数组,您需要使用嵌套foreach循环:

$units = array(
    'mL' => array(
        'Alcohol' => '12'
    )
);

foreach($units as $unit => $drugs) {
    foreach($drugs as $drug => $amount) {
        echo $drug . ' ' . $amount . ' ' . $unit . "\n";
    }
}

键盘演示

虽然,我不确定我是否遵循此层次结构中的逻辑。对我来说,这样的事情会更有意义:

array(
   'Alcohol' => array(
       'amount' => 12,
       'unit' => array(
           'name' => 'mL',
           'relativeQuantity' => 0.001 // ml in L
       )
   )
)

好读

于 2013-06-18T06:10:26.827 回答