在CakePHP 2.0中加载模型的最佳方法

时间:2012-03-06 12:56:57

标签: cakephp-2.0

我现在不确定在CakePHP 2.0中加载模型的最佳方法。


问题1

我有一个模型,其中多个数据库字段与另一个模型相关。

customers表包含字段country_origincountry_residencecountry_study,所有这些字段都包含表countries中的ID。

所以在我的客户模型中,我应该如何加载Country模型?


问题2

是否已弃用Controller::loadModel()或使用此功能是不好的做法?我怎么能在控制器中加载模型?


问题3

何时或为何必须在控制器或模型中使用App::uses()?如果您使用loadModel()hasOnehasManybelongsTo等常规方法,我无法理解模型何时会加载

3 个答案:

答案 0 :(得分:62)

这应该很容易理解。如果您使用的是控制器,并且需要加载其他型号,则可以调用:

$this->loadModel('SomeModel');

然后你可以像往常一样调用模型:

$this->SomeModel->read(null, '1');

App::uses用于延迟加载类。因此,您仍然可以使用以下方式加载模型:

App::uses('MyModel', 'Model');

但是你需要用不同的方式调用它:

$MyModel = new MyModel();
$MyModel->read(null, '1');

MyModel::read(null, '1');

这取决于您想要在何处以及如何使用它。

答案 1 :(得分:3)

首选方式是

$this->load('MyModel');

但是,您也可以使用

public $uses = array('DefaultModel', 'MyModel');
.
.
$this->MyModel->field(...);

Cake支持两者,您可以随意使用任何您喜欢的人。

答案 2 :(得分:0)

问题1

根据您的结构,客户和国家/地区模型之间存在关联,我认为我们不需要加载模型。 我们可以为每个id创建虚拟关联,例如

 'CountryOrigin' => array(
  'className' => 'Country',
  'foreignKey' => 'country_origin_id',
  'dependent' => true,
  'conditions' => '',
  'fields' => '',
  'order' => '',
  'limit' => '',
  'offset' => '',
  'exclusive' => '',
  'finderQuery' => '',
  'counterQuery' => ''
)


'CountryResidence' => array(
  'className' => 'Country',
  'foreignKey' => 'country_residence_id',
  'dependent' => true,
  'conditions' => '',
  'fields' => '',
  'order' => '',
  'limit' => '',
  'offset' => '',
  'exclusive' => '',
  'finderQuery' => '',
  'counterQuery' => ''
)

通过这样做,我们可以在模型之间创建关联,因此我们不希望显式加载模型

当我们没有关联时,加载模型是好的,

load model的语法是 对于单一模型加载

$this->loadModel('Country');

如果我们想要为特定操作或条件加载模型

,这将更有用

如果我们想在整个控制器中使用,我们可以使用$ uses变量 适用于多种型号负载。

public $uses = array('Country','OtherModel');

我们可以访问类似的模型,

$this->Country->find('count');