0

次のYiiモデルメソッドは、レコードごとに名前と説明の2つの値を返す必要がありますが、代わりに説明のみを返します。MySQLで直接実行すると、同じクエリが完全に機能します。Yiiは結合の1つが実行されるのを妨げていますか?

public function reportEducation(){
  $criteria = array(
    'select' => "
                 concat(person.name_first," ",person.name_last),
                 group_concat(person_studylevel.description)",
    'join' => "
       inner join person on junior = person.id
       inner join person_studylevel on level = person_studylevel.id",
    'group by' => 'junior'
  );
  return PersonEducation::model()->findAll($criteria);
}

これは私の質問です:

select 
   concat(person.name_first," ",person.name_last) as name,
   group_concat(person_studylevel.description separator ", ")
from person_junior_education
  left join person on junior = person.id
  left join person_studylevel on level = person_studylevel.id
group by junior

その一部はconcat_group関数と関係があるようです。これを削除すると、説明フィールドが正しく表示されるためです。

ただし、名前フィールドは表示されません。おそらく問題は、yiiがmysql関数をどのように処理するかです。

4

2 に答える 2

1

私のアドバイスは、複雑なクエリに CActiveRecord を使用しないことです。これは、そのために作成されたものではなく、SQL の代わりにもなりません。行に対して簡単にCRUDアクションを実行するのはそれだけです。

私がすることは、ビューを作成し、そのビューのモデルを作成することです。そのため、簡単に行うことができます:

PersonEducationView::model()->findAll(); // easy

ただし、アクティブなレコードを使用する必要がある場合は、PersonEducationモデルに 2 つの属性を作成して、クエリの結果を保存する場所を確保し、エイリアスを使用するようにクエリを更新して、保存場所を認識できるようにする必要があります。

   // protected/models/PersonEducation.php
   public $fullname;
   public $description;

   public function reportEducation(){
       $criteria = array(
       'select' => "
            concat(person.name_first," ",person.name_last) AS fullname,
            group_concat(person_studylevel.description) AS description",
        'join' => "
           inner join person on junior = person.id
           inner join person_studylevel on level = person_studylevel.id",
       'group by' => 'junior'
       );
       return PersonEducation::model()->findAll($criteria);
    }

免責事項:完全にテストされていません

于 2013-01-23T13:59:01.853 に答える
0

100% 確実ではありませんが、Yii は使用しているモデルのテーブルに「t」を使用して自動的にエイリアスを作成するため、列名を適切に呼び出していないことが原因である可能性があります。したがって、PersonEducation モデルの列を参照する場合は、"t" を前に付ける必要があります。あなたが正しいものを呼んでいることを確認してください。エイリアスを変更したい場合は、CDbCriteria の「エイリアス」プロパティを使用して、「person_education」などの意味のあるものに設定します。それが役に立てば幸い

于 2013-01-23T10:53:35.373 に答える