我有一个 zend 应用程序,可以显示比赛结果的排行榜。基本过程是确定要包含的事件列表,然后将一组列动态添加到 SQL 查询中。我最初的实现相当垃圾,我想对其进行反思。我手动构建了一个 SQL 字符串,并在最后调用 db->fetch()。我知道 - 垃圾代码,但我仍在学习 zend 并且有截止日期。
public function league()
{
...
$SQL = 'SELECT rr.runner AS runnerid, ru.firstname as firstname, ru.surname as surname, ';
// get the list of events
foreach($events as $eventrow)
{
$eventTable = new Model_DbTable_Event();
$event = $eventTable->find($eventrow->event)->current();
// generate the conditional column
$sum = $this->getEventSQL($event,$division->gender);
// append to the SQL string (nasty)
$SQL = $SQL . $sum;
}
$SQL = $SQL . 'lrd.racesComplete, lrd.pointsTotal, c.name as company ';
$SQL = $SQL . 'FROM raceresult rr ';
$SQL = $SQL . 'JOIN runner ru ON rr.runner = ru.id ';
$SQL = $SQL . 'LEFT JOIN company c ON c.id = ru.company ';
$SQL = $SQL . 'JOIN race ra ON rr.race = ra.id ';
...
...
$db = Zend_Db_Table::getDefaultAdapter();
$this->view->leaguetable = $db->fetchAll($SQL);
}
// create the SUM sql statement for a specific event
// SUM(CASE rr.race WHEN 15 THEN rr.points ELSE NULL END) as Result1,
// SUM(CASE rr.race WHEN 16 THEN rr.points ELSE NULL END) as Result2,
function getEventSQL($event,$type)
{
$eventTable = new Model_DbTable_Event();
$sum_sql = 'SUM(CASE rr.race ';
foreach($races as $race)
{
$sum_sql = $sum_sql . sprintf('WHEN %d',$race->id) . ' THEN rr.points ';
}
$sum_sql = $sum_sql . sprintf('ELSE NULL END) as \'%s\',',$event->id);
return $sum_sql;
}
我知道我需要使用 SQL SELECT/CASE 语句。
我想将此逻辑移动到扩展 Zend_Db_Table_Abstract 的类,但我仍然不确定有条件地控制所选列的最佳方法是什么。我知道我可以添加多个 where() 子句,在这种情况下可以使用 column() 方法吗?
class Model_DbTable_League extends Zend_Db_Table_Abstract
{
protected $_name = 'leaguerunnerdata';
protected $_primary = 'Id';
public function leagueTable($min,$max)
{
$sql = $this->select()
->setIntegrityCheck(false)
->from(array('l'=>'league'),array('col','col2','col3'))
->where('l.league = ?',1)
->where('r.standard > ?',$min)
->where('r.standard < ?',$max)
->order('l.pointsTotal DESC');
return $this->fetchAll($sql);
}
....
有什么想法/建议吗?