1

DbTable で fetchAll() を呼び出すと、DbTable で定義された適切な DbRow クラスで結果が得られます。

しかし、このようなカスタム クエリを作成すると、結果が配列で取得されます。このデータ ind DbRows を強制的に受信できるパラメーターはありますか、それとも自分で行を作成してそれらの配列を入力する必要がありますか?

$query = $this->_dbTable->getDefaultAdapter()->select()
        ->from('doctor.doctor')
        ->joinInner('facility.doctorfacility', 'facility.doctorfacility.doctor_id = doctor.doctor.id')
        ->joinInner('facility.facility', 'facility.doctorfacility.facility_id = facility.facility.id')
        ->where(implode(' AND ', $conds));

return $this->_dbTable->getDefaultAdapter()->fetchAll($query);
4

2 に答える 2

3

「しかし、このようなカスタムクエリを作成すると、配列で結果が得られます」

Zend_Db_Adapter_Abstract::fetchAll()コードのdocblockに従って配列を返す呼び出しを行っているため、配列を取得しています:-

/**
 * Fetches all SQL result rows as a sequential array.
 * Uses the current fetchMode for the adapter.
 *
 * @param string|Zend_Db_Select $sql  An SQL SELECT statement.
 * @param mixed                 $bind Data to bind into SELECT placeholders.
 * @param mixed                 $fetchMode Override current fetch mode.
 * @return array
 */
public function fetchAll($sql, $bind = array(), $fetchMode = null)

「DbTable で fetchAll() を呼び出すと、DbTable で定義された適切な DbRow クラスで結果が得られます。」

これを行うZend_Db_Table_Abstract::fetchAll()と、コード内の docblock に従ってZend_Db_Table_Rowset:-を返す呼び出しが行われます。

/**
 * Fetches all rows.
 *
 * Honors the Zend_Db_Adapter fetch mode.
 *
 * @param string|array|Zend_Db_Table_Select $where  OPTIONAL An SQL WHERE clause or Zend_Db_Table_Select object.
 * @param string|array                      $order  OPTIONAL An SQL ORDER clause.
 * @param int                               $count  OPTIONAL An SQL LIMIT count.
 * @param int                               $offset OPTIONAL An SQL LIMIT offset.
 * @return Zend_Db_Table_Rowset_Abstract The row results per the Zend_Db_Adapter fetch mode.
 */
public function fetchAll($where = null, $order = null, $count = null, $offset = null)

「このデータを DbRows で強制的に受け取ることができるパラメーターはありますか、それとも自分で行を作成してそれらの配列を入力する必要がありますか?」

いいえ、ありませんが、正しいオブジェクトで正しいメソッドを呼び出すと、行セットが返されます。

これを行うには、次の行を変更します:-

$query = $this->_dbTable->getDefaultAdapter()->select()

に:-

$query = $this->_dbTable->select()

この行: -

return $this->_dbTable->getDefaultAdapter()->fetchAll($query);

に:-

return $this->_dbTable->fetchAll($query);

これで必要なものが得られるはずです。ZF に行き詰まっている場合は、常にコードを確認する価値があります。ZF は、利用可能な最高のドキュメントです。

于 2012-06-08T18:26:53.977 に答える
1

データは複数のテーブルから取得されるため、強制することはできません。そのため、zend_dbを使用してマッピングすることはできません。データをエンティティにマッピングするために残されました。

オブジェクトの配列が必要な場合は、フェッチモードを変更できます。

Zend_Db :: FETCH_OBJ:オブジェクトの配列でデータを返します。デフォルトのクラスは、PHPの組み込みクラスstdClassです。結果セットの列は、オブジェクトのパブリックプロパティとして使用できます。

参考:フェッチモード

Doctrineのようないくつかのフレームワークでは、カスタムマッパーオブジェクトを渡すことができるマッパーを提供できます。

于 2012-06-08T15:15:55.107 に答える