1

私はそのような問題について考えていました...クラス Person があるとしましょう:

   class Person {  
    private $iPersonId;
    private $sName;  
    private $sLastName;  
    private $rConn;


public function __construct($rConn, $iPersonId) {
$this->rConn = $rConn;
$this->iPersonId = $iPersonId;
}

   public function load() {
      // load name and last name using the $rConn object and $iPersonId
   }  
   }

そして今、多くの人々に対していくつかのアクションを実行したいので、新しいクラスを書きます:

class People {

private $aPeople = array();

public function addPerson(Person $oPerson) {
// ...
}

public function loadPeople() {
// PROBLEM HERE //
}

}

ここで 2 つの問題があります: 1. Person と People には読み込み用の同じインターフェイス (関数 load()) がありますが、データを読み込むために People の $aPeople を反復処理したい場合、次のような maaaaany クエリが発生します。

SELECT * FROM people WHERE id = 1
SELECT * FROM people WHERE id = 2
SELECT ......
.....
....

そして、1000をロードしたい場合、何かがブームになります:)。

1 つのクエリですべてのユーザーを読み込むために、このコードをどのように設計すればよいですか? (の)

  1. People に追加するすべての Person オブジェクトで依存性注入を使い続ける必要があります。DRY ルールに反しており、見栄えがよくありません。

親愛なるユーザーの皆さん、このコードを設計するより良い方法は何ですか?

4

2 に答える 2

0

Symfony2 ( http://symfony.com/doc/2.0/book/service_container.html ) のようにサービスを構築する場合は、メソッドを追加するだけです。「人」に「load()」があるのは正しくないように思えます。それは何をロードしますか?オブジェクトまたはエンティティにデータベースへのアクセスを許可することも悪い習慣です。これにより、不要な依存関係が発生します。

  • あなたのエンティティまたはオブジェクトには、それ自体をロードする機能がありません。悪い習慣です。エンティティまたはオブジェクトを別のものに管理させます。
  • 混乱を招く依存関係を作成しないでください。オブジェクトを独自の目的に合わせてください。PersonEntity は、データベース接続または EntityManager について何も認識してはなりません
  • Composer を壊すことなく別のプロジェクトに移動できるように、コードをビルドします。http://getcomposer.org/

symfony2でそれを行う方法の例

class PeopleService
{
  private $em;

  /**
   * @param EntityManager $em
   */
  public function __construct(EntityManager $em)
  {
    $this->em = $em;
  }

  /**
   * @param int $id
   * @return Person
   */
  public function loadPerson($id)
  {
    // do something and return 1 person
    return $this->em->find('MyBundleNamspace:Person', $id);
  }

  /**
   * @return array of Person objects
   */
  public function loadPeople()
  {
    // do something and return an array with persons
  }
}
于 2013-03-25T14:45:11.517 に答える
0

大量の人をロードするには、People 内の静的メソッドをお勧めします。これには、コンストラクターを書き直すか、他のデータを初期化する別のメソッドを追加する必要もあります。

class Person {  
  protected $_data
  protected $rConn;


  public function __construct($rConn, $iPersonId) {
    $this->rConn = $rConn;
    $this->_data = array();
    $this->_data['id'] = $iPersonId;
  }

  public function load() {
    // load name and last name using the $rConn object and $iPersonId
  }

  // under the assumption, that $rConn is a mysqli connection
  // if not rewrite the specific section
  // also there is no injection protection or error handling in here
  // this is just a workflow example, not good code!
  public static function loadPeople($ids) {
    $res = $rConn->query("select * from people where id in (" . implode(',', $ids) . ")");
    $people = array();
    while ($row = $res->fetch_assoc()) {
      $p = new People($rConn, $row['id']);
      $p->setData($row);
      $people[] = $p;
    }
    $res->free();
    return $people;
  }

  public function setData($data) {
    foreach ($data as $key => $value {
      $this->_data[key] = $value;
    }
  }
}
于 2013-03-25T10:33:38.290 に答える