CakePHP:关联小规模项目的最佳实践;选择“;桌子

CakePHP:关联小规模项目的最佳实践;选择“;桌子,cakephp,foreign-keys,cakephp-model,Cakephp,Foreign Keys,Cakephp Model,快速最佳实践问题 我有以下协会: 用户有一个UserBasicInfo UserBasicInfo有一个用于国家(用户居住的国家)的select元素。 select元素由一个简单的“国家”表(id、国家名称、缩写)填充 最好使用Model::query()从国家表中获取数据吗?或者我应该为这些数据创建一个模型 如果创建模型,我应该使用与UserBasicInfo模型的关联,还是只使用$uses变量 如果它改变了答案,实际上有许多选择字段以类似的方式填充。Model::query()在cakeph

快速最佳实践问题

我有以下协会: 用户有一个UserBasicInfo
UserBasicInfo有一个用于国家(用户居住的国家)的select元素。
select元素由一个简单的“国家”表(id、国家名称、缩写)填充

最好使用Model::query()从国家表中获取数据吗?或者我应该为这些数据创建一个模型

如果创建模型,我应该使用与UserBasicInfo模型的关联,还是只使用$uses变量

如果它改变了答案,实际上有许多选择字段以类似的方式填充。

Model::query()在cakephp中做任何事情都不是最好的

在您正在使用的UsersController操作中

$this->set('countries', $this->User->Country->find('list'));
在编辑/添加表单中

$this->Form->input('country_id');

我对这种选择元素使用视图帮助器。如果我以你的情况为例,我会这样做:

控制器:

class UsersController extends AppController {
      ....
      public $helpers = array('Common');
      ....
}
助手:

class CommonHelper extends AppHelper {
      ....
      public function get_country_list() {
            App::import( 'Model', 'Country' );
            $objCountry = new Country();
            $countries = $objCountry->find( 'list' );
            return $countries;
      }
      ....
}
视图:

条件是您必须有一个国家/地区型号。通过这种方式,您可以填充任何下拉菜单。干杯

如果它改变了答案,实际上有许多选择字段以类似的方式填充

可能吧。您是否有多个国家/地区选择框,或者这些选择字段都来自不同的表?如果是前者,您可以使用
选项
键从一个数组中填充多个选择:

控制器: 视图:
否则,我通常通过在模型之间创建适当的关联来处理这种情况,然后使用
Model::find('list')
或自定义模型方法来检索选项。如果正确命名变量,则options变量将自动用作选择的选项:

控制器: 视图:
这违反了MVC模式。对不起,你能给我一个关于它是如何违反MVC模式的提示吗?那么Helper的目的是什么呢?阅读这本书,它有一个关于MVC和Helpers->book.cakephp.org的部分。App::import()在这里也是错误的,直接实例化模型也是不可能的。感谢burzum指出这一点。我总是喜欢遵循最佳实践。我将改变我上面提到的编码方式。
....
echo $this->Form->input('country_id', array(
     'options' => $this->Common->get_country_list(),
     'value' => !empty($data['UserBasicInfo']['country_id']) ? $data['UserBasicInfo']['country_id'] : ''
));
....
$this->loadModel('Country');
$this->set('countries', $this->Country->find('list'));
$this->Form->select('UserBillingInfo.country_id', $countries);
$this->Form->select('UserShippingInfo.country_id', $countries);
etc...
$this->set('countries', $this->User->UserBasicInfo->Country->find('list'));
$this->Form->input('UserBasicInfo.country_id');