在文本字段中存储表引用(适用于Agile Toolkit)

时间:2011-09-13 19:10:38

标签: php user-interface frameworks atk4

我最近一直在尝试RDB设计,我想知道将项目存储在一个可以有多个值的字段中:

    CARS        Color_avail
  1  corvette    1, 2, 3        <<<<<<<
  2  ferrari      2
  3  civic        1


    COLORS 
  1  red
  2  White 
  3  black 

所以在CRUD上我想通过下拉/复选框或者包含多个值的东西添加多个项目。

2 个答案:

答案 0 :(得分:2)

在昏迷分离列表中存储关系在某些意义上是有意义的。你不需要逗号。有2个现有的控件可以帮助您。

使用表单中的复选框显示值列表

$form->addField('CheckboxList','corvette')->setValueList($array);

(你可以通过$ model-&gt; getRows()填充数组,虽然我认为它需要是关联的。你可以用var_dump和foreach加入它们。

您的其他选择是使用带有可选网格的隐藏字段

$field = $form->addField('line','selection');
$grid = $form->add('MVCGrid');
$grid->setModel('Colors',array('name'));
$grid->addSelectable($field);

$form->addSubmit();

要隐藏实际字段,您可以使用“隐藏”代替“行”,也可以使用JavaScript隐藏它:

$field->js(true)->hide();

$field->js(true)->closest('dl')->hide();

如果你需要在字段周围隐藏标记。

答案 1 :(得分:2)

我可以看到在表单中显示这样的输出的好处,但是你真的想将它存储在数据库中吗?

例如,如果您的示例中包含逗号分隔列表的数据模型,您将使用哪种SQL来识别所有可用的白色汽车?

保持这样的多对多关系的传统方式是使用附加表格,例如你有一个单独的表,其中包含CAR_COLOUR以及以下内容

 CAR      COLOUR
 1        1
 1        2
 1        3
 2        2
 3        1

所以现在你可以轻松查询诸如获取所有汽车和颜色的列表

SELECT CAR, COLOUR
  FROM CARS CA, 
       COLOUR COL, 
       CAR_COLOUR CACOL
 WHERE CA.CAR=CACOL.CAR
   AND CACOL.COL=COL.COLOUR

如果您只想要白色汽车,请将以下内容添加到WHERE子句

   AND COL.COLOUR='White'

对于id字段和CAR_COLOUR中的两个字段的索引将意味着即使您有数千行也能获得出色的性能,而将它们全部放在单个字段中的逗号分隔列表中意味着您必须使用substr或类似这将阻止索引的使用,并意味着随着数据量的增长,性能将迅速下降。