我有一种方法,可以从数据库中的表中获取所有行,其顺序在参数中指定:
public static function getAllOrderedBy($orders = null)
{
$criteria = new Criteria();
if(is_array($orders))
{
foreach($orders as $column => $order)
{
if($order == 'asc')
{
$criteria->addAscendingOrderByColumn($column);
}
else if($order == 'desc')
{
$criteria->addDescendingOrderByColumn($column);
}
}
}
else if($orders != null)
{
$criteria->addAscendingOrderByColumn($orders);
}
return self::doSelect($criteria);
}
此方法发生在PagePeer
类中,但我想将其用于几个模型,如LinkPeer
或SubjectPeer
。我可以将这段代码从一个模型复制粘贴到另一个模型,但我想问的是,是否有更好的方法让这个方法对所有这些类都可用?
如果用法会改变,这不是问题,所以我不会调用PagePeer:getAllByOrder(PagePeer::TITLE)
,而是其他东西,我只是不想将此代码复制到它所使用的每个模型。
有两种方法可以做到这一点。
- 推动behviors。文档说明,您可以通过
staticMethods()
向对等类添加静态方法。 - Symfony mixin。它们被记录在
The Definitive Guide to symfony 1.0
中。参见第17章-扩展Symfony。在本指南的新版本中,关于mixins的信息被删除了,但sfMixer类的代码似乎没有改变(sf1.0中的sfMixer和sf1.4中的sfMixer)