我想为 Optgroup 下拉列表设置数据库布局
I want to Database Layout for Optgroup Dropdown
我想以 optgroup 下拉列表的形式在页面上显示一些数据,所以我只想像
这样的数据库布局
$arr = array(
'optgroup' => array(
'1','2','3'),
'optgroup2' => array(
'1','2','3')
);
db table 结构应该是 -
国家
id | name
州
id | country_id | name
关系应该是 -
Country HasMany State
在通过 -
获取所有国家之后
$countries = ClassRegistry::init('Country')->find(
'all',
array(
'conditions' => your conditions,
'fields' => array(fields),
'contain' => 'State',
)
)
根据需要通过遍历数组生成 optGroup
数组。
根据 BOSE 中士描述的数据库。
国家
id | name
州
id | country_id | name
SQL
CREATE TABLE IF NOT EXISTS `countries` (
`id` int(11) NOT NULL,
`name` varchar(255) CHARACTER SET utf8 NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `states` (
`id` int(11) NOT NULL,
`country_id` int(11) NOT NULL,
`name` varchar(60) CHARACTER SET utf8 NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `countries`
ADD PRIMARY KEY (`id`);
ALTER TABLE `states`
ADD PRIMARY KEY (`id`);
ALTER TABLE `countries`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
ALTER TABLE `states`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
还有两个型号:
<?php // File: Model/Country.php
App::uses('AppModel', 'Model');
class Country extends AppModel {
public $hasMany = array('State');
}
<?php // File: Model/State.php
App::uses('AppModel', 'Model');
class State extends AppModel {
public $belongsTo = 'Country';
}
在CountriesController.php:
public function test(){
$countries = $this->Country->find('all');
$countries = Set::combine($countries, '{n}.Country.name', '{n}.State.{n}.name');
$this->set('countries', $countries);
}
$countries 现在持有问题中描述的数组并发送到视图
array(
'Norway' => array(
(int) 0 => 'Oslo',
(int) 1 => 'Bergen'
),
'Sweeden' => array(
(int) 0 => 'Stockholm',
(int) 1 => 'Göteborg',
(int) 2 => 'Malmö'
)
)
在视图中(View/Countries/test.ctp 在我的例子中)
<?php
echo $this->Form->select('field', $countries);
?>
将创建以下 html 代码:(这是一个下拉列表)
<select name="data[field]" id="field">
<option value=""></option>
<optgroup label="Norway">
<option value="0">Oslo</option>
<option value="1">Bergen</option>
</optgroup>
<optgroup label="Sweeden">
<option value="0">Stockholm</option>
<option value="1">Göteborg</option>
<option value="2">Malmö</option>
</optgroup>
</select>
我想以 optgroup 下拉列表的形式在页面上显示一些数据,所以我只想像
这样的数据库布局$arr = array(
'optgroup' => array(
'1','2','3'),
'optgroup2' => array(
'1','2','3')
);
db table 结构应该是 -
国家
id | name
州
id | country_id | name
关系应该是 -
Country HasMany State
在通过 -
获取所有国家之后$countries = ClassRegistry::init('Country')->find(
'all',
array(
'conditions' => your conditions,
'fields' => array(fields),
'contain' => 'State',
)
)
根据需要通过遍历数组生成 optGroup
数组。
根据 BOSE 中士描述的数据库。
国家
id | name
州
id | country_id | name
SQL
CREATE TABLE IF NOT EXISTS `countries` (
`id` int(11) NOT NULL,
`name` varchar(255) CHARACTER SET utf8 NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `states` (
`id` int(11) NOT NULL,
`country_id` int(11) NOT NULL,
`name` varchar(60) CHARACTER SET utf8 NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `countries`
ADD PRIMARY KEY (`id`);
ALTER TABLE `states`
ADD PRIMARY KEY (`id`);
ALTER TABLE `countries`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
ALTER TABLE `states`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
还有两个型号:
<?php // File: Model/Country.php
App::uses('AppModel', 'Model');
class Country extends AppModel {
public $hasMany = array('State');
}
<?php // File: Model/State.php
App::uses('AppModel', 'Model');
class State extends AppModel {
public $belongsTo = 'Country';
}
在CountriesController.php:
public function test(){
$countries = $this->Country->find('all');
$countries = Set::combine($countries, '{n}.Country.name', '{n}.State.{n}.name');
$this->set('countries', $countries);
}
$countries 现在持有问题中描述的数组并发送到视图
array(
'Norway' => array(
(int) 0 => 'Oslo',
(int) 1 => 'Bergen'
),
'Sweeden' => array(
(int) 0 => 'Stockholm',
(int) 1 => 'Göteborg',
(int) 2 => 'Malmö'
)
)
在视图中(View/Countries/test.ctp 在我的例子中)
<?php
echo $this->Form->select('field', $countries);
?>
将创建以下 html 代码:(这是一个下拉列表)
<select name="data[field]" id="field">
<option value=""></option>
<optgroup label="Norway">
<option value="0">Oslo</option>
<option value="1">Bergen</option>
</optgroup>
<optgroup label="Sweeden">
<option value="0">Stockholm</option>
<option value="1">Göteborg</option>
<option value="2">Malmö</option>
</optgroup>
</select>