0

生成された Peer 静的クラスを使用して、Propel で構成されたいくつかのテーブルがあります。

私の問題は、異なるが類似したテーブルで同じ検索操作を実行する必要があることです。これらのテーブルには、Propel がどのように機能するかによって異なる Peer クラスがあります。この状況は、これらのテーブルで実行されるクエリに関するコードの重複につながります。

evalこの場合、私を助けるかもしれないいくつかの構造( function の使用を避ける)があるかどうか疑問に思っていました。異なる静的 Peer クラスに対してまったく同じ呼び出しを実行する重複したコードを作成することは本当に避けたいと思います。

私が書いているクラスの(非常に長い)メソッドからのコードスニペットの例:

$criteria = new Criteria();
$criteria->add(FoobarPeer::CONTRACTNR,$data['contractnr']);
$result = FoobarPeer::doSelect($criteria);
if(count($result) > 1){
  throw new FoobarException("status: more than one row with the specified contractnr.");
}
if(count($result) == 0){
  // no object with given contractnr. Create new one.
  $obj = $this->factory->createORM("foobar");
  $obj->setCreatedAt(time());
} else {
  // use and update existing object.
  $obj = $result[0];
}

ご覧のとおり、行オブジェクトのファクトリ メソッドを作成できましたが、静的クラスに対して同じことを行う方法が見つかりませんでした。言い換えれば、静的クラスへのアクセスを動的にし、醜い回避策ではなくしたいと考えています。

何か案は?

ありがとう :)

4

2 に答える 2

1

行動を使用して、やろうとしていることを達成できるはずです。動作を使用して、生成されたピア オブジェクトにカスタム コードを追加できます。ここを参照してください。

特に、ビヘイビアーは次のメソッドを実装できます。

staticAttributes()   // add static attributes to the peer class
staticMethods()      // add static methods to the peer class

これらを使用して、必要なコードをピアに追加できるはずです。コードを書くことについて心配する必要があるのは 1 回だけです。Propel はコード生成プロセス中にコードを複製しますが、生成されたものの多くがとにかく複製されるため、これはあまり心配する必要はありません。少なくとも、重複は自動化されたプロセスによってのみ導入されます。

于 2013-07-02T07:17:10.317 に答える