我有一套相当独特的条件和顺序,我需要从“卖家”表中检索我在Zend框架中构建的应用程序的数据。
客户端基本上是在请求一个应用程序,其中目录页面以非常特定的顺序列出卖家,即:
我正在试图找出一种最有效的方法来编写一个动作助手,它将以正确的顺序返回上面的数据,知道我的一些视图只需要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);
}
}
}
答案 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 Concerns和Single Responsibility Principle,以获得更易维护的代码。即使你是长期项目中唯一的开发人员,从现在开始的6个月你也不会记得你写的是什么以及为什么。如果有其他人参与该项目,那么清晰度将变得非常重要。