1

ハイドレーションがどのように機能するかを学び、理解するのは初めてです。最初にそれを指摘したかっただけです. 現在、選択クエリと挿入クエリを問題なくハイドレートできます。

私は現在、更新クエリをハイドレートしようとして立ち往生しています。私のエンティティでは、データベースの列の種類ごとに取得/設定オプションを設定しました。ObjectProperty() Hydrator が私の状況にも最適であることがわかりました。

ただし、設定された数の列のみを更新してハイドレーターを介して抽出しようとすると、他のすべてのオプションが設定されておらず、null 値が返されるため、エラーが発生します。特定の行のすべてを更新する必要はなく、いくつかの列だけを更新します。

たとえば、私の DB テーブルには次のようなものがあります。

  • 名前
  • 電話番号
  • 電子メールアドレス

しかし、更新する必要があるのは phone_number だけです。

$entity_passport = $this->getEntityPassport();
$entity_passport->setPrimaryPhone('5551239876');

$this->getTablePassport()->update($this->getHydrator()->extract($entity_passport), array(
    'employeeid' => '1'
));

setName() と setEmailAddress() がこの更新プログラムに含まれておらず、値を null にすることはできないというクエリが返されるため、これはエラーを返します。しかし、DB テーブルを見ると、データが既に存在していることは明らかです。そこにあるデータも変更する必要はありません。この例では、PrimaryPhone() 番号のみを変更します。

私はいたるところでドキュメントを探して読んでいますが、私が間違っていることを説明するものは何も見つかりません。Zend\Db (Doctrine ではない) のみを使用していることに注意してください。

私が理解しようとしているこの新機能に関する知識が不足しているため、どこかで何かを見逃していると思います。

おそらく、更新クエリをハイドレートしないでください...私はちょっと迷ったり混乱したりしています。どんな助けでも大歓迎です。ありがとうございました!

4

1 に答える 1

3

水分補給について根本的な誤解をしていると思います。ハイドレーターは、単にデータからエンティティ オブジェクトを生成し (ハイドレート)、エンティティ オブジェクトからデータを抽出します (抽出)。そのため、クエリの種類ごとに個別のハイドレーターはありません。

更新の例では、最初に完全なエンティティ オブジェクト ($entity_passport) を取得し、それを TableGateway の update メソッドに渡す必要があります。これが更新に使用している条件であるため、employeeid でエンティティを取得します。だから、このようなもの:

$entity_passport = $passportMapper->findByEmployeeId(1);
$entity_passport->setPrimaryPhone('5551239876');

$this->getTablePassport()->update($this->getHydrator()->extract($entity_passport), array(
    'employeeid' => $entity_passport->getId()
));

これは、ある種のマッパー レイヤーがあることを前提としています。それ以外の場合は、パスポートの TableGateway を使用できます (getTablePassport() が返すものだと思いますよね?)。

それ以外の場合、オブジェクトの取得がオーバーヘッドが大きすぎると考え、クエリを実行したいだけの場合は、\Zend\Db\Sql\Sql オブジェクトのみを使用できます。つまり、次のようになります。

$sql =  new \Zend\Db\Sql\Sql($dbAdapter);
$update = $sql->update('passport')
->set(array('primary_phone' => $entity_passport->getPrimaryPhone()))
->where(array('employeeid' => $employeeId));

編集: マッパーを起動するのは間違いだったのかもしれません。混乱を招く可能性があるからです。TableGateway を使用してエンティティ オブジェクトを取得し、返された行をハイドレートすることができます。

$rows = $this->getTablePassport()->select(array('employeeid' => 1));
$entity_passport = $this->getHydrator($rows->current());
[...]

編集 2: あなたの要点を確認したところ、いくつかのことに気付きました。

あなたの getTablePassport は実際に TableGateway のサブクラスであるオブジェクトを返すことがわかります。HydratingResultset を使用するように、このクラスを既に設定しています。これは、ゲートウェイを使用してオブジェクトを取得するときに、手動でハイドレートを行う必要がないことを意味します。同じクラスに既に Search メソッドも実装しています。ただし、現在はすべての列に LIKE を使用しているため、その方法を変更します。非常に非効率であるだけでなく、id 列などで間違った結果が得られます。

そのメソッドを修正する場合は、単純に Service オブジェクトで呼び出すことができます。 $this->getTablePassport->Search(array('employeeid' => 1));

それ以外の場合は、その tablegateway クラスに別のメソッドを実装するだけです。

public function findByEmployeeId($employeeId)
{
  return $tableGateway->select(array('employeeid' => $employeeId));
}

これはすでにエンティティの配列 (またはこの特定のケースでは 1 つ) を返しているはずです。PSは、エンティティを取得するときに実際に何が返されているかをデバッグして確認してください。したがって、更新を試みる前に、PassportTable から取得したエンティティを print_r します。まず、取得コードが適切に機能することを確認する必要があります。

于 2013-07-13T19:47:58.683 に答える