0

Zendフレームワークで構築しているアプリケーションの「sellers」テーブルからデータを取得する必要がある、かなりユニークな条件と注文のセットがあります。

クライアントは基本的に、次のような非常に特定の順序で販売者をリストするディレクトリ ページのアプリケーションを要求しています。

  1. 過去 7 日間に承認された出品者 (その後、以下の #4 で注文)
  2. 次に、サイトのアップグレード機能の料金を支払い、7 日以上経過している売り手 (その後、以下の #4 で注文)
  3. 次に、7日以上経過している出品者と7日以上経過している出品者(その後、以下の#4で注文)
  4. 上記のすべてについて、第 2 の順序は発売日、次に企業名のアルファになります。

上記の正しい順序でデータを返すアクション ヘルパーを作成する最も効果的な方法を見つけようとしています。一部のビューは 1、2 (および 4) しか必要としないのに対し、アプリケーション内の他のビューは4つすべてが必要です。

現在、2 つまたは 3 つの個別のクエリを作成し、それらをビュー内の 2 または 3 に渡していpartialloopますが、適切に記述されたコードを目指しており、3 つのクエリを渡すことができる 1 つのオブジェクトに結合したいと考えています。 1 つの部分ループに、または.... 1 つのクエリを記述します。これはどのように行うことができますか?

現時点での私のヘルパーは次のとおりです。

class Plugin_Controller_Action_Helper_ListSellers extends Zend_Controller_Action_Helper_Abstract
{

//put your code here
public function direct($regulars = false, $filter = false)
{
    $dateMod = $this->dateMod = new DateTime();
    $dateMod->modify('-7 days');
    $formattedDate = $dateMod->format('Y-m-d H:i:s');
    // get sellers initialized in last 7 days
    $sellerTable = new Application_Model_DbTable_Seller();



        // get sellers initialized in last 7 days
        $select = $sellerTable->select()->setIntegrityCheck(false);
        $select->from(array('b' => 'seller'),array('sellerID', 'businessName','sellerPicture'));
        // select firstName, lastName, picture from user table, and businessName and sellerID from seller table.  All records from seller table
        $select->join(array('u' => 'user'), 's.userID = u.userID', array('firstName', 'lastName'));
        $select->order('s.launchDate DESC','s.businessName ASC');
        $select->where('s.active = 1 AND s.contentApproval = 1 AND s.paymentApproval = 1');
        $select->where('s.launchDate > ?', $formattedDate);
        if($filter){ $select->where('s.categoryID = ?', $filter);}
        $newSellers = $sellerTable->fetchAll($select);



        $query = $sellerTable->select()->setIntegrityCheck(false);
        $query->from(array('b' => 'seller'),array('sellerID', 'businessName','sellerPicture'));
        // select firstName, lastName, picture from user table, and businessName and sellerID from seller table.  All records from seller table
        $query->join(array('u' => 'user'), 's.userID = u.userID', array('firstName', 'lastName'));
        $query->order('s.launchDate DESC','s.businessName ASC');

        $query->where('s.active = 1 AND s.contentApproval = 1 AND s.paymentApproval = 1 AND s.featured = 1');
        $query->where('s.launchDate < ?', $formattedDate);
        if($filter){ $select->where('s.categoryID = ?', $filter);}
        $featuredSellers = $sellerTable->fetchAll($query);


    if($regulars){
        $where = $sellerTable->select()->setIntegrityCheck(false);
        $where->from(array('b' => 'seller'),array('sellerID', 'businessName','sellerPicture'));
        // select firstName, lastName, picture from user table, and businessName and sellerID from seller table.  All records from seller table
        $where->join(array('u' => 'user'), 's.userID = u.userID', array('firstName', 'lastName'));
        $where->order('s.launchDate DESC','s.businessName ASC');

        $where->where('s.active = 1 AND s.contentApproval = 1 AND s.paymentApproval = 1 AND s.featured IS NULL');
        $where->where('s.launchDate < ?', $formattedDate);
        $regularSellers = $sellerTable->fetchAll($where);
    }

}
}
4

1 に答える 1

2

クエリに制限が適用されているようには見えません。では、一致するすべてのレコードを本当に選択したいということでしょうか? スケーラビリティの理由から、答えはノーであると思います。制限が適用されます。この場合、3 つの異なるクエリを実行するだけで済みます。

ただし、適用する制限がない場合は、フィルター処理も並べ替えも行われていないすべての販売者を選択する単一の単純なクエリを実行し、ビュー ヘルパーまたはビューのみで並べ替えとフィルター処理を行うことができます。

いずれにせよ、 Zend が構築されたModel-View-Controller パターンを使用する場合は、データベース クエリをコントローラー レイヤー内に配置しないことをお勧めします。コントローラーは薄くする必要があります。モデルはすべてのデータベース クエリを処理し、結果をコントローラーに出力する必要があります。私はData Mapper パターンを広範囲に使用しています。何かのようなもの:

$mapper = new Application_Model_SellerMapper();

$newSellers = $mapper->fetchNewSellers();
$featuredSellers = $mapper->fetchFeaturedSellers();
$regularSellers = $mapper->fetchRegularSellers();

各メソッドは、インスタンスではなくインスタンスfetchX()の配列を返します。Application_Model_SellerZend_Db_Table_Row

このようにして、より保守しやすいコードのために、懸念の分離単一責任の原則をより適切に維持します。あなたが長期にわたってプロジェクトの唯一の開発者であったとしても、今から 6 か月後には、自分が何を、なぜ書いたかを覚えていないでしょう。そして、他の誰かがプロジェクトに参加する場合、明確さが非常に重要になります。

于 2012-07-03T19:21:30.790 に答える