5

Yii CActiveRecord 派生クラスから最初のレコードを取得する必要があります。Railsでは、これを行うことができます:

post = Post.first

次のようにYiiで同じことができると思いました:

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

しかし、その方法は存在しません。最初のレコードを取得するには、条件付きで find を実行する必要がありますか?

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に自動的に a が適用さ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) を渡すこともできます。

次に、post クラスに対してこれを行うと、次のように最初のモデルにアクセスできます。

$first = Post::model()->first();
于 2013-02-08T20:52:03.783 に答える
5

CActiveRecord::find()1つのモデルのみを返します。

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