php - Yii CActiveRecord 类有 first() 方法吗?

标签 php yii

我只需要从 Yii CActiveRecord 派生类中获取第一条记录。在 Rails 中,我只能这样做:

post = Post.first

我想我可以像这样用 Yii 做同样的事情:

$post = Post::model()->first();

但是那个方法不存在。我是否必须只找到有条件的才能获得第一条记录?

我在 CActiveRecord 的文档中没有看到 first() 所以我假设答案是否定的,它没有 first 方法。那么,如何只查询第一条记录呢?

这行得通,但肯定是一个丑陋的 hack。当然有更好的方法。

$first = Post::model()->findAll(array('order'=>id, 'limit'=>1));

最佳答案

Yii 不会对数据的排序方式做出任何假设。良好的数据库设计要求,如果您使用代理键,该键应该具有无意义的值。这意味着不要将其用于订购。

撇开这个问题不谈,这可能是进行查询的最佳方式:

$first = Post::model()->find(array('order'=>'id ASC'));

通过使用 find 而不是 findAll,您会自动将 LIMIT 1 应用于您的结果。我不会跳过包含 order by 子句的内容,因为它确保数据库将一致地对结果进行排序。

如果你经常使用这个查询,你可以创建下面的方法。 UPDATE:修改为在 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)。

然后,如果您为后期类(class)执行此操作,您可以像这样访问第一个模型:

$first = Post::model()->first();

关于php - Yii CActiveRecord 类有 first() 方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14779763/

相关文章:

php - SQL 查询和 PHP

php - php中二维数组的多重选择

PHP mysql 使用 FIND IN SET 来搜索列值

yii - PHPUnit 自动加载器错误 : Class 'Yii' not found

php - preg_replace 不接受 unicode

php - 在 Codeigniter 中加载主页时如何跳过数据库文件或模型文件?

php - Yii2 - 如何列出文件夹内的文件

mysql - 与外键相关的表相互同步

php - Yii 无法访问 session 变量

php - 添加脚本 CHtml::textField() 方法