Najlepszy sposób ładowania modeli w CakePHP 2.0

Nie jestem pewien, jak najlepiej załadować modele w CakePHP 2.0.


Pytanie 1

Mam model, w którym więcej niż jedno pole bazy danych jest powiązane z innym modelem.

customers tabela zawiera pola country_origin, country_residence i country_study i wszystkie te pola zawierają ID z tabeli countries.

Więc w moim modelu Klienta, jak mam załadować model kraju?


Pytanie 2

Został wycofany czy używanie tego jest złą praktyką? Jak mam załadować model do kontrolera?


Pytanie 3

Kiedy i dlaczego musisz używać App::uses() w kontrolerze lub modelu? Nie rozumiem punktu, kiedy modele i tak się załadują, jeśli używasz normalnych metod, takich jak loadModel(), hasOne, hasMany, belongsTo, itd.

Author: BadHorsie, 2012-03-06

3 answers

To powinno być proste do zrozumienia. Jeśli używasz kontrolera i musisz załadować inny model, możesz wywołać:

$this->loadModel('SomeModel');

Następnie możesz wykonywać połączenia do modelu, tak jak zwykle:

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

App::uses służy do leniwego ładowania klas. Tak więc nadal możesz załadować model używając uses:

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

Ale wtedy będziesz musiał nazwać to inaczej:

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

Lub

MyModel::read(null, '1');
To zależy tylko od tego, gdzie i jak chcesz go użyć.
 62
Author: Chuck Burgess,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-26 17:10:18

Preferowanym sposobem jest

$this->load('MyModel');

Można jednak również użyć

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

Cake obsługuje oba i możesz używać każdego, kogo chcesz.

 3
Author: ayudh_das,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-01 12:39:43

Na Pytanie 1

Zgodnie z Twoją strukturą istnieje związek między modelem klienta i kraju, więc nie musimy ładować modelu. Możemy utworzyć wirtualne skojarzenie dla każdego identyfikatora, takie jak,

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

W ten sposób możemy utworzyć skojarzenie pomiędzy modelami, więc nie chcemy jawnie ładować modelu

Model ładowania jest dobry, gdy nie mamy skojarzenia, które możemy wykorzystać jako,

Składnia modelu load jest Dla pojedynczego modelu load

$this->loadModel('Country');

Będzie to bardziej przydatne, jeśli chcemy załadować model dla konkretnej akcji lub warunku

Jeśli chcemy używać całego kontrolera możemy użyć zmiennej $uses Dla wielu obciążeń modelu.

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

Możemy uzyskać dostęp do modelu jak,

$this->Country->find('count');
 0
Author: Harshal Shinde,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-19 13:37:49