2016-11-29 2 views
1

私はCakePHP 3.xのデータベースにデータを保存するには2通りの方法がありますが、動作するものとそうでないものがあります。明白なこと以外に、私は働かせることができません、なぜあなたは他のものよりむしろ1つを使用するでしょうか?そして、方法の1つが私のために働いていない理由を伝えることができますか?cakephpにデータを保存する相違点

オプション1:(動作しない)

$usersTable = TableRegistry::get('users'); 
$user = $usersTable->newEntity(); 
$user = $usersTable->patchEntity($user, $this->request->data); 
$usersTable->save() 

このオプションは、エラーを与え、

Warning (4096): Argument 1 passed to Cake\ORM\Table::save() must implement interface Cake\Datasource\EntityInterface, none given, called in 
Notice (8): Undefined variable: entity [CORE\src\ORM\Table.php, line 1453] 

はオプション2:

$user = $this->Users->newEntity(); 
$user = $this->Users->patchEntity($user, $this->request->data); 
$this->Users->save($user) 
+0

必須の引数を省略することは、もちろん有効ではありません。 – ndm

答えて

0

最初のものは明らかに動作することはできません動作します保存メソッド内に引数がありません:

$usersTable->save(); // invalid 
$usersTable->save($user); // valid 

ユーザーがコントローラからデータを保存している場合、なぜTableRegistryを使用するのですか?私はいつも2番目の方が好きです。TableRegistryを使用するのは少し遅いプロセスです(数マイクロ秒以下であるかもしれません)。

+0

ありがとう - 私はそれを逃した方法を知らない。 Cake Documentationは2つの異なる方法を使用していますが、2つのメリット/デメリットをどこでも見つけることができません。 – ChrisBull

+0

@ChrisBullドキュメントではどこでこのような使い方がありますか?それは無効で、修正する必要があります! – ndm

+2

@ManoharKhadkaもし 'TableRegistry'を直接使うのは、コントローラの魔法のプロパティアクセサや、さまざまな追加の関数呼び出しを発行する' loadModel() 'を使うよりも速く、最後に' TableRegistry :: get() 「あまりにも。しかし、魔法のプロパティや 'loadModel()'を使うことは単体テストの方が便利です。モックを簡単にすると同時にモデルファクトリを変更する方が簡単です。 – ndm