0

下面的 Yii 模型方法应该返回 2 个值,名称和描述,每条记录,而不是只返回描述。当直接在 MySQL 中执行时,相同的查询可以完美运行。Yii 是否阻止执行其中一个连接?

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 回答