Doctrineは削除nestedset
-
20-09-2019 - |
質問
私はいくつかのモデルの魔女はDoctrineのnestedset機能を使用している必要があります。 私はそれが自分のアプリケーションで必要とされているので、ツリーからの要素の削除functionalyを追加します。私は、ドキュメントからの抜粋でしようとしていたが、私はそのコードと非常に奇妙なエラーを取得しています。
YAMLはここにある: http://pastie.org/820978する
そして、私は私のMenuクラスの魔女にこのコードをしようとしています生成された抽象クラスBaseMenuとBaseMenuはDoctrine_Recordを拡張拡張:)
とにかく私のコード:
public function getMenuItem($id)
{
return Doctrine::getTable('Menu')->find($id);
}
public function delete($id)
{
$item = $this->getMenuItem($id);
//echo get_class($item); will return Menu so object exists !?
$item->getNode()->delete();
}
そして、私はこのエラーを取得します:
致命的なエラー:メンバ関数の呼び出し 非オブジェクトにgetNode()
そして、私はちょうど気づいたget_class($アイテム)trowingさ交戦(ようprobabblyこの奇妙な行動の理由です):
警告:get_class()は、パラメータを期待します 1に...
指定されたオブジェクト、真偽値であることを
しかし、私はこのためのソリューションを必要とし、すべてのヒントは歓迎されている...
解決
getNode()Doctrine_Node、ないDoctrine_Recordを返します。
A Doctrine_Recordを削除することができますが、Doctrine_Nodeを削除することはできません - 。それはとにかく、永続的ではありませんので、
正しい論理は単純になります:
$item = $this->getMenuItem($id)->delete();
また、「削除」モデルにメソッドの名前を指定しないでください!これは、それをデバッグしようとする狂気あなたを駆動するDoctrine_Recordのdelete()メソッドをオーバーライドします。
他のヒント
私は個人的には、コードは非常に乾燥したことはありませんので、教義:: getTable(「TABLE_NAME」)を使用して好きではありません。何らかの理由で「table_nameは」今までに変更された場合、あなたは場所の多くにそれを変更する必要があります。
私は使用の私の典型的なパターンは、私のモジュール内のすべてのモデルの保護されたインスタンスをインスタンス化する必要、Zend Frameworkのアプリケーションに教義を使用します。
そのパターンを使用して、私はちょうど私のコントローラでこれを行うだろう。
$this->_Menu
->getTable()
->find($id)
->getNode()
->delete();
あなたが本当に似てあなたの機能を維持したい場合は、私はこのようなものを使用します。
public function getMenuItem($id)
{
if (empty($id))
{
throw new Exception ("A parameter of id is required to retrieve a menu item".);
}
return $this->getTable()->find($id);
}
public function delete($id)
{
$item = $this->getMenuItem($id);
if ($item instanceof Doctrine_Record == false)
{
throw new Exception("Item is not a valid Menu Record.");
}
$item->getNode()->delete();
}
答えはあなたの質問である:DB(また、私はあなたの$ IDを推測では、このようなIDを持つ行が存在しないため、$項目は(私はそれが値がfalseだと思うが、あなたはのvar_dump($アイテム)を使用することができます)オブジェクトではありません)nullです。
警告:get_class()は、パラメータ1で指定されたオブジェクト、ブール値であることが期待...
致命的なエラー:非オブジェクト上のメンバ関数getNode()の呼び出し