首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Yii CActiveRecord类有没有first()方法?

Yii CActiveRecord类有没有first()方法?
EN

Stack Overflow用户
提问于 2013-02-09 03:15:43
回答 3查看 9.5K关注 0票数 5

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

代码语言:javascript
复制
post = Post.first

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

代码语言:javascript
复制
$post = Post::model()->first();

但这种方法并不存在。我是不是必须在有条件的情况下执行find,才能获得第一条记录?

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

这是可行的,但肯定是一个丑陋的技巧。当然还有更好的方法。

代码语言:javascript
复制
$first = Post::model()->findAll(array('order'=>id, 'limit'=>1));
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-09 04:29:45

CActiveRecord::find()仅返回一个模型。

代码语言:javascript
复制
$first=Post::model()->find();
票数 5
EN

Stack Overflow用户

发布于 2013-02-09 04:52:04

Yii不会对你的数据如何排序做任何假设。良好的数据库设计要求,如果使用代理键,则该键应该具有无意义的值。这意味着不要使用它来排序。

抛开这个问题不谈,下面可能是执行查询的最好方法:

代码语言:javascript
复制
$first = Post::model()->find(array('order'=>'id ASC'));

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

如果您经常使用此查询,则可以创建以下方法。更新:已将其修改为在primaryKey复合或缺失时抛出异常。我们也可以添加更多的错误检查,但我们将其留给读者作为练习。;)

代码语言:javascript
复制
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类执行此操作,则可以访问第一个模型,如下所示:

代码语言:javascript
复制
$first = Post::model()->first();
票数 7
EN

Stack Overflow用户

发布于 2018-08-16 18:35:29

执行findOne()时,Yii2会要求提供一个条件。

您可以不带任何条件地执行find(),只需返回one()

代码语言:javascript
复制
$first= Post::find()->one();

要真正确保您只需向其添加一个orderBy子句:

代码语言:javascript
复制
$first= Post::find()->orderBy(['id' => SORT_ASC])->one();

命令函数也是如此:

代码语言:javascript
复制
$first= \Yii::$app->myDatabase->createCommand('SELECT * FROM Post ORDER BY id ASC')->queryOne();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14779763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档