Yii 不会对您的数据应该如何排序做出任何假设。良好的数据库设计要求如果您使用代理键,则该键应该具有无意义的值。这意味着不使用它来订购。
撇开这个问题不谈,这可能是进行查询的最佳方式:
$first = Post::model()->find(array('order'=>'id ASC'));
通过使用find
而不是findAll
您自动将 aLIMIT 1
应用于您的结果。我不会跳过 order by 子句的包含,因为这样可以确保数据库对结果进行一致的排序。
如果您经常使用此查询,则可以创建以下方法。更新:修改它以在 primaryKey 是复合或丢失时引发异常。我们也可以添加更多错误检查,但我们将其留给读者作为练习。;)
public function first($orderBy = null){
if(!$orderBy){
$orderBy = self::model()->tableSchema->primaryKey;
}
if(!is_string($orderBy)){
throw new CException('Order by statement must be a string.');
}
return self::model()->find(array('order'=>$orderBy));
}
然后将此方法包含在扩展 CActiveRecord 的类中,然后从该类扩展您的所有模型。
默认情况下,我编写的包装器将按主键排序结果,但如果您愿意,您可以选择传递不同的列和方向(ASC 或 DESC)。
然后,如果您为 post 类执行此操作,则可以像这样访问第一个模型:
$first = Post::model()->first();