web-dev-qa-db-ja.com

CakePHPの異なるモデル内で1つのモデルを使用できますか?

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'];
    }

}
?>
56
useranon

古いスレッドですが、答えは不完全で「なぜ」に欠けていると思うので、私はチャイムに行きます。 CakePHPには、モデルをロードする3つの方法があります。 Controllerの外部で機能するメソッドは2つだけですが、3つすべてについて説明します。バージョンの可用性についてはわかりませんが、これはコアなものであるため、動作するはずです。

App::import()はファイルを見つけてrequire() sだけを検出する必要があるため、クラスをインスタンス化して使用します。 import()にクラスのタイプ、名前、およびファイルパスの詳細を伝えることができます。

ClassRegistry::init()はファイルをロードし、インスタンスをオブジェクトマップに追加して、インスタンスを返します。これは、通常の方法でクラスをロードした場合に発生する「ケーキ」を設定するため、何かをロードするためのより良い方法です。クラス名のエイリアスを設定することもできます。

Controller::loadModel()ClassRegistry::init()を使用し、Modelをプロパティとして追加しますコントローラー。また、$persistModel将来のリクエストのモデルキャッシング用。これはコントローラーでのみ機能し、それがあなたの状況である場合、私は他の前にこの方法を使用します。

119
JCotton

これらの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);
26
inkedmn

誰もが見逃した明らかな解決策は、必要に応じて、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');
    }
}
15
Brad Koch

CakePHP 1.2では、以下を使用することをお勧めします。

ClassRegistry::init('Attribute')->save($data);
11
michas

これは単純に行います

<?php
   class Form extends AppModel
    {
       //...
          $another_model = ClassRegistry::init('AnotherModel');
       //...  
    }
?>
4
Mohd. Umar

CakePHP 3では、 TableRegistry :: get(modelName) を使用できます

use Cake\ORM\TableRegistry;

$itemsOb = TableRegistry::get('Items');
$items = $itemsOb->find("all");
debug($items);
2
tarikul05

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);
1