1つのモデル内で別のモデルを使用できますか?
例えば。
<?php
class Form extends AppModel
{
var $name='Form';
var $helpers=array('Html','Ajax','Javascript','Form');
var $components = array( 'RequestHandler','Email');
function saveFormName($data)
{
$this->data['Form']['formname']=$data['Form']['formname'];
$this->saveField('name',$this->data['Form']['formname']);
}
function saveFieldname($data)
{
$this->data['Attribute']['fieldname']=$data['Attribute']['fieldname'];
}
}
?>
古いスレッドですが、答えは不完全で「なぜ」に欠けていると思うので、私はチャイムに行きます。 CakePHPには、モデルをロードする3つの方法があります。 Controllerの外部で機能するメソッドは2つだけですが、3つすべてについて説明します。バージョンの可用性についてはわかりませんが、これはコアなものであるため、動作するはずです。
App::import()
はファイルを見つけてrequire()
sだけを検出する必要があるため、クラスをインスタンス化して使用します。 import()
にクラスのタイプ、名前、およびファイルパスの詳細を伝えることができます。
ClassRegistry::init()
はファイルをロードし、インスタンスをオブジェクトマップに追加して、インスタンスを返します。これは、通常の方法でクラスをロードした場合に発生する「ケーキ」を設定するため、何かをロードするためのより良い方法です。クラス名のエイリアスを設定することもできます。
Controller::loadModel()
はClassRegistry::init()
を使用し、Modelをプロパティとして追加しますコントローラー。また、$persistModel
将来のリクエストのモデルキャッシング用。これはコントローラーでのみ機能し、それがあなたの状況である場合、私は他の前にこの方法を使用します。
これらの2つの方法のいずれかを使用して、任意のモデル/コントローラー内から他のモデルのインスタンスを作成できます。
Cake 1.2を使用している場合:
App::import('model','Attribute');
$attr = new Attribute();
$attr->save($dataYouWantToSavetoAttribute);
Cake 1.1を使用している場合:
loadModel('Attribute');
$attr = new Attribute();
$attr->save($dataYouWantToSavetoAttribute);
誰もが見逃した明らかな解決策は、必要に応じて、2つのモデルの間に 関連付け を作成することです。これを使用して、あるモデルを別のモデルから参照できるようにすることができます。
class Creation extends AppModel {
public $belongsTo = array(
'Inventor' => array(
'className' => 'Inventor',
'foreignKey' => 'inventor_id',
)
);
public function whoIsMyMaker() {
$this->Inventor->id = $this->field('inventor_id');
return $this->Inventor->field('name');
}
}
CakePHP 1.2では、以下を使用することをお勧めします。
ClassRegistry::init('Attribute')->save($data);
これは単純に行います
<?php
class Form extends AppModel
{
//...
$another_model = ClassRegistry::init('AnotherModel');
//...
}
?>
CakePHP 3では、 TableRegistry :: get(modelName) を使用できます
use Cake\ORM\TableRegistry;
$itemsOb = TableRegistry::get('Items');
$items = $itemsOb->find("all");
debug($items);
Model_A内でModel_Bを使用する場合は、Model_Aファイルの先頭に次の行を追加します。
App::uses('Model_B_ClassName', 'Model');
そして、Model_A内で使用できるようになります。例えば:
$Model_B = new Model_B_ClassName();
$result = $Model_B->findById($some_id);