Yii CActiveRecord类是否有first()方法


Does the Yii CActiveRecord class have a first() method?

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

post = Post.first

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

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

但这种方法并不存在。我必须在有条件的情况下找到第一张唱片吗?

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

这是有效的,但肯定是一个丑陋的黑客。当然还有更好的方法。

$first = Post::model()->findAll(array('order'=>id, 'limit'=>1));
Yii不会对数据的排序方式做出任何假设。良好的数据库设计要求,如果使用代理键,则该键应该具有无意义的值。这意味着不使用它进行订购。

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

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

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

如果您经常使用此查询,则可以创建以下方法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)。

然后,如果你为post类这样做,你可以访问第一个模型,如下所示:

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

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

$first=Post::model()->find();
执行findOne()时,Yii2请求一个条件。

你可以在没有条件的情况下进行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();