1

私は zend フレームワークを初めて使用します。この単純な関数で、単一の「投稿」を取得してから、関連するテーブル内のすべてのコメントを検索したい

public function getPost($idPost)
{
    $db=  Zend_Registry::get('db');

    $select=$db->select()
            ->from($this->_name, '*')
            ->where("idPost= ".$db->quote($idPost, 'INTEGER'));

    $stmt=$select->query();
    $rowset=$stmt->fetchAll();
    $post=$rowset->current();

    //ora devo aggiungerci i commenti che questo post ha ricevuto
    $comm=$post->findDependentRowset('commenti');

    $ris=array($post, $comm);

    return $ris;

}

私のインデックスコントローラーでは、単にこの関数を呼び出しますが、次のエラーが発生します。

Call to a member function current() on a non-object in C:\xampp\htdocs\...

間違いはどこですか?

4

3 に答える 3

5

Zend_Db の使用方法について、いくつかの誤解があると思います。

1. ORM を使用しておらず、PDO ラッパーのみを使用している

つまり、クエリは Zend の行セットと行を返さないため、それらに対して使用できるメソッドを使用することはできません。

2. デフォルトのフェッチ モード

Zend_Db_Statement fetchAll() メソッドのデフォルトのフェッチ モードは配列です。オブジェクト (stdClass) を返す場合は、データをフェッチする前にフェッチ モードを変更します。

$stmt->setFetchMode(Zend_Db::FETCH_OBJ);

3. 実際に 1 つの行が必要な場合に fetchAll() を使用する

1 行だけが必要な場合は、テーブル全体を取得しないでください。Zend_Db_Statement では、たとえば次のように使用します。

$row = $stmt->fetch();

また

$rowObj = $stmt->fetchObject();

... 繰り返しますが、これは zend 行オブジェクトではなく、単なる stdClass インスタンスですが、次のことができます。

$rowObj->some_field;

その上で。

一方、これが Post モデルのメソッドである場合は、次のようになります。

public function getPost($idPost)
{
    return $this->getRow($idPost);
}

これにより投稿が返されます。テーブルの関係を正しく設定している場合は、依存データを照会したり、その ID を持つすべてのコメントを個別に取得したりすることもできます。

于 2013-01-13T17:51:48.650 に答える
1

問題は、前述のようにテーブル クラスを定義しない限り、従属行セットまたは親行セットを使用できないことです。

現在の関数を機能させるには、2 つの関数を使用するのが最適であり、シンプルに保ちます。

public function getPost($idPost)
{
    $db= new Zend_Db_Table($this->_name);

    $select=$db->select()
            ->where("idPost= ?", $idPost);
    /*Fetch just the row you want, or use fetchAll() if you need to match return types*/   
    $row = $db->fetchRow($select);

    return $row;

}

public function getComments($table='comments', $id) {

    $db = new Zend_Db_table($table);

    $select = $db->select()->where('post_id = ?', $id)->order('date ASC');
    $rowset = $db->fetchAll($select);

    return $rowset/* or you could return an array ->$rowset->toArray() */

}

Zend_Db_Tableは現在のデータベース アダプタを使用しようとしているので、テーブル名を渡すだけで済みます。

quote()もう 1 つ注意してください: 処理が終わったら、関数を使用する必要はありませんselect()

しかし、Zend_Db を使用する場合は、「テーブル クラスの定義」について学ぶ必要があることが非常に重要です。少なくとも自分のクラスでそれらを使用するには十分です。

これが役立つことを願っています!

于 2013-01-15T06:14:56.620 に答える
0

行セットと従属行セットを取得するには、 を使用する必要がありますZend_Db_Table。のみを使用Zend_Db_AdapterZend_Db_Selectます。

ここから読んでください。したがって、から拡張するクラスを定義する必要がありますZend_Db_Table_Abstract

例:

class Bugs extends Zend_Db_Table_Abstract
{
    protected $_name = 'bugs';
    protected $_primary = 'bug_id';
}

Zend_Db_Table_Rowsetオブジェクトを取得するには:

$bugs   = new Bugs();
$rowset = $bugs->fetchAll("bug_status = 'NEW'");

依存行セットを見つけるには、テーブル クラスでリレーションを定義する必要があります。リレーションシップの定義方法については、こちらを参照してください。

于 2013-01-13T16:27:01.473 に答える