web-dev-qa-db-ja.com

CakePHP 2.0でモデルをロードする最良の方法

CakePHP 2.0でモデルをロードする最良の方法は今はわかりません。


質問1

複数のデータベースフィールドが別のモデルに関連付けられているモデルがあります。

customersテーブルには、フィールド_country_Origin_、_country_residence_、および_country_study_があり、これらすべてのフィールドにはテーブルcountriesのIDが含まれています。

私の顧客モデルでは、国モデルをどのようにロードするのですか?


質問2

Controller::loadModel()は非推奨になりましたか、これを使用するのは悪い習慣ですか?コントローラーにモデルをロードするにはどうすればよいですか?


質問

コントローラーまたはモデルでApp::uses()を使用する必要があるのはいつですか? loadModel()hasOnehasManybelongsToなどの通常のメソッドを使用した場合、モデルがとにかくロードされるポイントがわかりません。

23
BadHorsie

これは簡単に理解できるはずです。コントローラーを使用していて、別のモデルをロードする必要がある場合は、次を呼び出すことができます。

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

どこでどのように使用したいかによって異なります。

62
Chuck Burgess

好ましい方法は

$this->load('MyModel');

ただし、使用することもできます

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

Cakeは両方をサポートしており、好きな人を自由に使用できます。

3
ayudh_das

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

これを行うことで、モデル間の関連付けを作成できるため、モデルを明示的にロードしたくありません。

モデルの読み込みは、使用できる関連付けがない場合に適しています。

ロードモデルの構文は、単一モデルロードの場合

$this->loadModel('Country');

これは、特定のアクションまたは条件のモデルをロードする場合により便利です。

コントローラー全体で使用したい場合は、複数のモデルのロードに$ uses変数を使用できます。

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

次のようなモデルにアクセスできます。

$this->Country->find('count');
0
Harshal Shinde