0

我有一组相当独特的条件和订单,我需要从“卖家”表中为我在 Zend 框架中构建的应用程序检索数据。

客户基本上是在请求一个应用程序,其中目录页面以非常特殊的顺序列出卖家,即:

  1. 在过去 7 天内获得批准的卖家(然后通过下面的 #4 订购)
  2. 然后,在网站上为升级功能付费并且超过 7 天的卖家(然后通过下面的 #4 订购)
  3. 然后,超过 7 天和超过 7 天的卖家(然后通过下面的#4 订购)
  4. 对于上述所有内容,二级订单将是他们的发布日期,然后是企业名称的 alpha

我试图找出最有效的方法来编写一个动作助手,它将按照上面正确的顺序返回数据,我知道我的一些视图只需要 1,2(和 4),而应用程序中的其他视图将需要全部 4。

现在,我一直在编写两个或三个单独的查询,并将它们传递给partialloop视图内的 2 或 3 ,但我努力编写正确的代码,并且想将我的 3 个查询组合成一个我可以传递的对象到一个部分循环,或者....写一个查询。如何才能做到这一点?

这是我现在的帮手:

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 构建的模型-视图-控制器模式。控制器应该很薄。您的模型应该处理所有数据库查询,并将结果吐出到您的控制器中。我广泛使用数据映射器模式。就像是:

$mapper = new Application_Model_SellerMapper();

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

您的每个fetchX()方法都将返回一个实例数组Application_Model_Seller,而不是Zend_Db_Table_Row实例。

通过这种方式,您可以更好地维护关注点分离单一职责原则,从而获得更易于维护的代码。即使您是该项目长期的唯一开发人员,从现在起 6 个月后,您也不会记得您写了什么以及为什么写了。如果其他人参与该项目,清晰度就变得非常重要。

于 2012-07-03T19:21:30.790 回答