我有 3 个数据库表,如 rooms
、room_type
和 room_status
。这是表的结构
rooms
room_id, room_number, room_type_id, room_status_id
room_type
room_type_id, room_type_name, room_type_desc
room_status
room_status_id, room_status_name, room_status_desc
因此,实际上基于此表需要创建表单以添加新房间。我已经创建了房间控制器和模型。
我的想法是基于房间表创建表单,并为room_type和房间状态创建另外两个控制器。之后,从room_type和room_status获取数据并将其传递给房间形式,我可以在其中使用此数据创建选择元素。
你能建议我如何实现更好的解决方案吗?我不确定这是好的解决方案。
[编辑]
'$status = $this->createElement('select', 'status');
$status->setLabel("Select a status:");
$status->addMultiOption('Active', 'active');
$status->addMultiOption('Suspended', 'suspended');
$this->addElement($status);`
正如你在这里看到的addMultiOptionis
静态的,如何从数据库中使其动态化?我希望我能向你解释我的想法?
如果我明白你想做什么,但我不确定我是否这样做。 通过表单设置类型和状态在某些情况下有效。
您可能要做的第一件事是向room
表添加room_status_id
,以便跟踪当前状态.
我想象您的上下文是酒店或会议中心类型的设置。在这种情况下,房间类型可能不会经常更改,但状态可能每天更改几次><。因此,像管理控制台一样做一个表单来设置房间并进行初始类型和状态指定以及偶尔的更改将是合适的。对于日常操作,您可能希望在各种控制器操作中包含自动状态更改。
一些伪代码例如:
initiate room (admin): set room_type, set room_status;
reserve room: set room_status: reserved;
room in use: set room_status: in use;
room vacant: if (room != clean) {
set room_status: not clean
} else {
set room_status: clean
}
room being remodeled(admin)
if (room_type === change) {
set type: new room_type;
} else {
don't change room_type;
}
if (inRemodel === true) {
set room_status: unavailable;
}
您可能不需要控制器来room_type和room_status因为此信息不太可能被大量更改或操纵.
room_type 并且room_status似乎是最初设置然后很少更改值的那种数据。如果是这种情况,模型将是访问这些值的地方,然后将它们传递到需要的地方.
我希望我没有完全错过重点。
[编辑]您询问如何在评论中显示room_type和room_status的名称。您将使用联接:
//make a dbTable model for each table
//in your Application_Model_DbTable_Room, built a method similar to this to join the tables
public function fetchRoomData() {
//setIntegrityCheck to false to allow joins
$select = $this->select(Zend_Db_Table::SELECT_WITH_FROM_PART)
->setIntegrityCheck(FALSE);
//performs join aliasing table room_type to t
$select->join(array('t' => 'room_type'), 't.room_type_id = room.room_type_id');
////performs join aliasing table room_status to s
$select->join(array('s' => 'room_status'), 's.room_status_id = room.room_status_id');
$result = $this->fetchAll($select);
return $result;
}
[编辑]要显示基于 db 表的选择表单元素:
$bidlocation = new Zend_Form_Element_Select('room_type');
$bidlocation->setLabel('Room Type: ');
$b = new Application_Model_DbTable_RoomType();
$a = $b->fetchAll();
foreach ($a as $c) {
//applies caps to first letter of each word
$d = ucwords($c['room_type_name']);
$bidlocation->addMultiOption($c['room_type_id'], $d);
}