2012-03-06 2 views
21

Я не уверен в том, что теперь можно загрузить модели в CakePHP 2.0.Лучший способ загрузки моделей в CakePHP 2.0


Вопрос 1

У меня есть модель, в которой более чем одно поле базы данных, связанная с другой моделью.

customers таблица имеет поле country_origin, country_residence и country_study и все эти поля содержат идентификатор из таблицы countries.

Итак, в модели моего заказчика, как я могу загрузить модель страны?


Вопрос 2

ли Controller::loadModel() устарела или это плохая практика, чтобы использовать это? Как я могу загрузить модель в контроллер?


Вопрос 3

Когда и почему вы должны использовать App::uses() в контроллер или модели? Я не понимаю точку, когда модели будут загружаться в любом случае, если вы используете обычные методы, как loadModel(), hasOne, hasMany, belongsTo и т.д.

ответ

61

Это должно быть простым для понимания. Если вы используете контроллер, и вам необходимо загрузить другую модель, вы можете позвонить:

$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'); 

Это просто зависит от того, где и как ты хотите использовать его.

+5

Я пытался загрузить модель из поведения как внутри, так же плагин. В этом случае вы должны использовать: 'App :: uses ('MyModelName', 'MyPluginName.Model');' в Behavior и 'App :: uses ('MyPluginNameAppModel', 'MyPluginName.Model');' в файл MyModelName. – colares

+0

Спас день! Благодарю. –

+0

Как использовать 'public $ uses = array ('Model1', 'Model2');' в контроллере? Я хотел бы знать, предпочитается ли '$ uses' над' $ this-> loadModel() '. – JadedCore

3

Предпочтительный способ

$this->load('MyModel'); 

Однако, вы можете также использовать

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

Cake поддерживает, и вы можете использовать кого угодно.

0

К вопросу 1

В соответствии с вашей структурой существует связь между клиентами и Country модели я думаю нам не нужно загружать модели. Мы можем создать виртуальную ассоциацию для каждого идентификатора, таких как,

'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' => '' 
) 

Делая это, мы можем создать ассоциацию между моделями, так что мы не хотим загружать модели явного

Загрузки модели хорошо, когда мы не «т иметь ассоциацию, что мы можем использовать в качестве,

Синтаксис для загрузки модели является для единой модели нагрузки

$this->loadModel('Country'); 

Это будет более полезно, если мы хотим загрузить модель для конкретного действия или условия.

Если мы хотим использовать весь контроллер, мы можем использовать переменную $ uses Для загрузки нескольких моделей.

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

мы можем получить доступ к модели, как,

$this->Country->find('count'); 
Смежные вопросы