5

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

post = Post.first

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

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

但这种方法不存在。我是否必须找到条件才能获得第一条记录?

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

这可行,但肯定是一个丑陋的黑客。肯定有更好的办法。

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

3 回答 3

7

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();
于 2013-02-08T20:52:03.783 回答
5

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

$first=Post::model()->find();
于 2013-02-08T20:29:44.917 回答
1

Yii2 在做 a 时要求一个条件findOne()

您可以find()无条件执行以下操作,然后返回one()

$first= Post::find()->one();

要真正确定你可以在其中添加一个orderBy子句:

$first= Post::find()->orderBy(['id' => SORT_ASC])->one();

命令功能也是如此:

$first= \Yii::$app->myDatabase->createCommand('SELECT * FROM Post ORDER BY id ASC')->queryOne();
于 2018-08-16T10:35:28.750 回答