来自同一用户表的复杂Zend查询

时间:2012-07-03 16:47:44

标签: php mysql sql zend-framework zend-db

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

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

  1. 过去7天内获得批准的卖家(然后按下面#4排序)
  2. 然后,已经在网站上支付升级功能的卖家,并且是7天以上(然后按#4排序)
  3. 然后,卖家超过7天,超过7天(然后按#4排序)
  4. 对于上述所有情况,次要订单依次为其发布日期,然后是商家名称
  5. 我正在试图找出一种最有效的方法来编写一个动作助手,它将以正确的顺序返回上面的数据,知道我的一些视图只需要1,2(和4),而其他视图该应用程序将需要全部4个。

    现在,我一直在编写两到三个单独的查询,并将它们传递给视图中的2个或3个partialloop,但我努力编写正确的代码,并希望合并我的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);
        }
    
    }
    }
    

1 个答案:

答案 0 :(得分:2)

我没有看到对您的查询应用任何限制。那么这是否意味着您真的想要选择所有匹配记录?出于可伸缩性的原因,我猜测答案应该是否定的,将会有限制。在这种情况下,您可能只需要进行3次不同的查询。

但如果没有要应用的限制,那么您可以执行一个简单的查询,选择所有卖家,未过滤和未排序,并在视图助手或视图中进行排序和过滤。

无论如何,我建议不要将数据库查询放在控制器层中,假设您要使用构建Zend的Model-View-Controller pattern。控制器应该很薄。您的模型应该处理所有数据库查询,并将结果吐出到控制器中。我广泛使用Data Mapper pattern。类似的东西:

$mapper = new Application_Model_SellerMapper();

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

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

这样可以更好地维护Separation of ConcernsSingle Responsibility Principle,以获得更易维护的代码。即使你是长期项目中唯一的开发人员,从现在开始的6个月你也不会记得你写的是什么以及为什么。如果有其他人参与该项目,那么清晰度将变得非常重要。