Yii CActiveRecord类是否有first()方法?

时间:2013-02-08 19:15:43

标签: php yii

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

post = Post.first

我以为我可以和Yii做同样的事情:

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

但该方法不存在。我是否必须找到有条件才能获得第一张唱片?

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

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

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

3 个答案:

答案 0 :(得分:7)

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 OR DESC)。

然后,如果您为post类执行此操作,则可以访问第一个模型,如下所示:

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:0)

Yii2在进行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();