0

私はCakePHPに取り組み始め、ドキュメントを読みましたが、それでも2つのことが少し不器用に思えます。

  1. 保存したい特定のレコードがある他のフレームワークを知っていますが、CakePHPは匿名でそれを行うことを提案しています:

    $this->Foo->create(array(...));
    $this->Foo->save();
    

    他のすべてのフレームワークと同じように、保存するレコードをCakePHPに指示できないのはなぜですか。

    $foo = $this->Foo->create(array(...));
    $foo->save();
    
  2. コントローラ内のRecordSet全体を反復処理したいと思います。使用を繰り返す必要があるのはなぜですか

    $foos = $this->Foos->find('all');
    foreach($foos as $foo){
       $foo['Foo'] // ... here we have $foo.
    

    find()なぜ2次元配列が返され、内部配列にはレコードしかないのかわかりません。これが直接レコードの配列ではないのはなぜですか?

4

1 に答える 1

1
  1. $this->Foo は Foo モデルのインスタンスです。その上でメソッドを呼び出すと、Foo モデルのそのインスタンスのアクティブなレコード (存在する場合) でメソッドが呼び出されます。そのため、どのレコードを保存するかを Cake に伝えるという点では、その必要はありません。Cake は現在アクティブなレコードを保存することを知っています。

コメント付きで貼り付けたコードを次に示します。これが役立つ場合があります。

// Prepare this instance of the Foo model to save a new record
$this->Foo->create(array(...));

// Save the new record that we have just prepared
$this->Foo->save();

そして逆に…

// Call the create method on this instance of the Foo model, and return what?
// Return another instance of the Foo model?
// Why not just continue using the instance we already have, ie, $this->Foo
$foo = $this->Foo->create(array(...));

// Call the save method on the duplicate instance of the Foo model that was
// returned from the create method?
$foo->save(); 

// Why did 'create' need to return a duplicate instance of the model to do a save???
// Why not call the save on the same instance of the Foo model that we used to call the create?

ポイント2.これは基本的に一貫性のためです。多くの場合、相互にリンクされた複数のテーブルからデータを返します。テーブル Foo と Bar が 1 対 1 の関係にあり、関連する Bar レコードと共に Foo レコードを取得しているとします。返される配列には Foo と Bar キーが必要です。 :

$foo['Foo']['column1']、$foo['Foo']['column2']、$foo['Bar']['column1']、$foo['Bar']['column2' ]

一貫性を保つために、1 つのテーブルからのみフェッチした場合でも、複数のテーブルから結合されたデータをフェッチした場合と同様に、$foo['Foo']['column1'] の形式で返されます。

編集:あなたのコメントに応えて、あなたがコードを持っていると言います:

$foos = $this->Foos->find('all');

返された配列の各行で何らかのモデル メソッドを呼び出したいとします。それを行う方法はいくつかあります。1つの方法は次のようなものです:

// This is code for the controller
$this->Car->find('all');
foreach($cars as $car){
    $this->Car->driveTwoMiles($car); // the driveTwoMiles would be in your model class

}

したがって、モデルには次のメソッドがあります。

// This would be a method in your model class
function driveTwoMiles($car){
    $this->id = $car['Car']['id']; // set the active record
    // we are now inside the model, so $this->id is the same as calling $this->Car->id from the controller

    // Do whatever you want here. You have an active record, and your $car variable, holding data
    $this->Post->saveField('distance_driven', $car['Car']['distance_driven']+2);
}

また、多くのレコードではなく 1 つのレコードを更新する場合は、「find('all')」ではなく「read」を実行できます。詳細については、以下のリンクを参照してください。

ケーキクックブックのこれらのページを最後まで読むことを強くお勧めします。

http://book.cakephp.org/2.0/en/models/retriving-your-data.html - データの取得

http://book.cakephp.org/2.0/en/models/ Saving-your-data.html - データの保存

http://book.cakephp.org/2.0/en/models/deleting-data.html - データの削除

いずれも、Cake モデルの操作方法に関する非常に重要な基本情報が含まれています。今すぐ時間をかけて本当に理解してください。そうすれば、将来、無数の頭痛の種やコードのリファクタリングを避けることができます!

于 2012-08-28T22:58:06.367 に答える