2

いくつかの列を持つCategoryというテーブルがあり、データベースからほんの少しだけ取得しようとしています。

だから私はこれを試しました:

$sql = 'SELECT uppercat AS id, COUNT(uppercat) AS uppercat FROM category GROUP BY uppercat;';
$d = Yii::app()->db->createCommand($sql)->query();

しかし、出力がおかしいと思います。array_shiftを実行しようとしましたが、これが配列ではないというエラーが表示されます。$ dでvar_dumpを実行すると、次のようになります。

object(CDbDataReader)[38]
  private '_statement' => 
    object(PDOStatement)[37]
      public 'queryString' => string 'SELECT uppercat AS id, COUNT(uppercat) AS uppercat FROM category GROUP BY uppercat;' (length=100)
  private '_closed' => boolean false
  private '_row' => null
  private '_index' => int -1
  private '_e' (CComponent) => null
  private '_m' (CComponent) => null

OK..それから私は$idでforeachをしました:

array
  'id' => string '0' (length=1)
  'uppercat' => string '6' (length=1)
array
  'id' => string '3' (length=1)
  'uppercat' => string '2' (length=1)
array
  'id' => string '6' (length=1)
  'uppercat' => string '1' (length=1)
array
  'id' => string '7' (length=1)
  'uppercat' => string '2' (length=1)
array
  'id' => string '9' (length=1)
  'uppercat' => string '2' (length=1)

それでは、配列が含まれているのに$ idは配列ではないというメッセージが表示されるのはなぜですか?

データベースから特定のデータを取得し、それらに対してarray_shiftを実行する方法は他にありますか?また、findAllBySqlを使用してこれを実行しようとしましたが、モデルにないCOUNT(uppercat)の属性に到達できません。モデルに追加する必要があると思いますが、必要なのは1回だけなので、それは望ましくありません。

4

2 に答える 2

5

CDbCommandのクエリは、クエリ結果をフェッチするためのCDbDataReaderオブジェクトを返します。代わりにqueryAllを使用して、行の配列を返します。

ただし、CDbCriteriaを使用して実行すると、より良い結果が得られます(そのためには、モデルプロパティが必要です。その通りです)。

プロパティがと呼ばれると仮定すると、次のようになりますcountUppercat

$criteria = new CDbCriteria;
$criteria->select = 'uppercat, COUNT(uppercat) AS countUppercat';
$criteria->group = 'countUppercat';
$models = CategorieModel::model()->findAll($criteria);
于 2012-05-30T16:47:38.120 に答える
3

これを試してみてください..あなたが承認したクローズドを使用しました...

$sql = 'SELECT uppercat AS id, COUNT(uppercat) AS uppercat FROM categorie GROUP BY uppercat;';
$d = Yii::app()->db->createCommand($sql)->queryAll();

その後、配列を表示したい場合は、次を使用します。

print_r($d);

配列を取得します。

それはあなたのために働くでしょう..

于 2012-05-30T18:33:37.953 に答える