4

私はzendを初めて使用します。かつてプレーンPHPで作成されていたWebサイトを再開発し、それをzendフレームワークに組み込むように依頼されました。

私はデータベースの関係に多くの問題を抱えています。関係の定義とクエリに頭を悩ませているようには見えません。

カテゴリを探したいのですが。そのカテゴリから、それに関連付けられているすべてのCategoryInfoを検索し、そのデータセットをクエリ/並べ替え/制限できるようにしたいと思います。

これが私のモデルです。

Categorys.php

<?php
  class Default_Model_Categorys extends Zend_Db_Table_Abstract
  {
      protected $_name = 'Categorys';
      protected $_primary = 'id';

      protected $_dependentTables = array('Default_Model_CategoryInfo');
 }
?>

CategoryInfo.php

<?php
class Default_Model_CategoryInfo extends Zend_Db_Table_Abstract
{
    protected $_name = 'Category_Info';
    protected $_primary = 'id';

    protected $_referenceMap = array(
        'Categorys' => array(
            'columns' => array('cat_id'),
            'refTableClass' => 'Default_Model_Categorys',
           'refColumns' => array('id')
        )
      );
}
?>

CategoryController.php

<?php
  class CategorysController extends Zend_Controller_Action
  {
      public function indexAction()
      {
        /*
          this should redirect to all games
        */
          return $this->_forward("index", "games");
      }

      public function categoryAction()
      {
          /*
            shows a specific category
          */
          $id = (int) $this->_request->getParam('id');
          $category = new Default_Model_Categorys();
          $this->view->category = $category->fetchRow(
              $category->select()->where('id = ?', $id)
          );

          $categoryInfo = $this->view->category->findDependentRowset('Default_Model_CategoryInfo');

      }
  }

まず...私は何か間違ったことをしていますか?

次に...依存する行セットをクエリするにはどうすればよいですか?

4

2 に答える 2

1

まず、主キーでカテゴリを検索する場合は、次のfind()方法を使用する方が簡単です。

$id = (int) $this->_request->getParam('id');
$category = new Default_Model_Categorys();
$this->view->category = $category->find($id)->current();

次に、依存するCategory_Info行を制限またはソートするために、Zend_Db_Table_Selectオブジェクトをのオプションのパラメーターとして使用できますfindDependentRowset()。次に例を示します。

$select = $category->select()->where("info_type = 'PRICE'")
                             ->order("info_date")
                             ->limit(3);
$categoryInfo = $this->view->category->findDependentRowset(
    'Default_Model_CategoryInfo', null, $select);

任意のテーブルオブジェクトを使用して、その選択オブジェクトを作成できることに注意してください。FROMそのselectの" "句はfindDependentRowset()メソッドによって設定されるため、他の句を追加してから渡すだけです。

$_dependentTablesPS: PHPコードを介してカスケード更新またはカスケード削除を使用する場合を除いて、宣言する必要はまったくありません。そうしないことを強くお勧めします。RDBMSにこれらのカスケード操作を処理させる方がはるかに効率的です。

$_primary同様に、データベーステーブルが実際に主キー制約を宣言しているかどうか を宣言する必要はありません。Zend_Db_Table_Abstractメタデータを検査して主キー列を取得する方法を知っています。

于 2009-09-22T00:35:44.750 に答える
0

すべてが私には正しく見えます。依存する行セットを照会しません。これはクエリ自体であり、結果セットを返します。基本的には、$ _ referenceMapで定義されているように、作業している現在の行に関連するすべてのレコードをプルします。findDependentRowset()を実行すると、Zend_Db_Table_Rowのインスタンスを提供する結果をforeachできます。そこから、必要に応じて関連データを表示できます。

個人的には、Zend_Dbリレーションシップは使用しません。必要なものを照会するための2番目のモデルメソッドを作成する方がはるかに簡単です。また、Zend_Dbリレーションシップはwhere句をサポートしていないため、2番目のクエリを作成するだけでリレーションシップよりもはるかに柔軟になります。

于 2009-09-22T00:07:03.280 に答える