我正在尝试转换像这样的SQL查询
select
t1.id,t1.form,t1.type,
group_concat(t2.department) as departments
from appraisal t1
join department t2 on find_in_set(t2.id,t1.dept)
group by t1.id
进入yii2 AppraisalSearch模型。
我试过
$query->joinWith(['departments' , 'on find_in_set(department.id,appraisal.dept) ']);
和
$query->andFilterWhere(
['group_concat','appraisal','departments.department'])
,但它没有给出正确的结果。
我还在评估模型中增加了关系,如
public function getDepartments()
{
return $this->hasMany(Department::className(), ['id' => 'dept']);
}
使此查询有效的正确格式是什么?
评估表的表结构是
--
-- Table structure for table `appraisal`
--
CREATE TABLE `appraisal` (
`id` int(11) NOT NULL,
`type` varchar(250) DEFAULT NULL,
`form` varchar(250) DEFAULT NULL,
`start_time` date DEFAULT NULL,
`end_time` date DEFAULT NULL,
`dept` varchar(250) DEFAULT NULL,
`admin_id` varchar(250) DEFAULT NULL,
`appr` varchar(1000) DEFAULT NULL,
`apps` varchar(1000) DEFAULT NULL,
`desg_appr` varchar(250) DEFAULT NULL,
`desg_apps` varchar(250) DEFAULT NULL,
`remark` varchar(250) DEFAULT NULL,
`sem` varchar(250) DEFAULT NULL,
`acad_yr` varchar(250) DEFAULT NULL,
`date` varchar(250) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Indexes for dumped tables
--
--
-- Indexes for table `appraisal`
--
ALTER TABLE `appraisal`
ADD PRIMARY KEY (`id`);
和部门的表结构是
--
-- Table structure for table `department`
--
CREATE TABLE `department` (
`id` int(11) NOT NULL,
`department` varchar(100) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Indexes for dumped tables
--
--
-- Indexes for table `department`
--
ALTER TABLE `department`
ADD PRIMARY KEY (`id`);
在评估表appraisal.dept中,值以逗号分隔的形式存储,如1,2,33,4
。另外,如何对andFilterWhere
字段
departments
条件
答案 0 :(得分:1)
使用别名时应该小心,它们不应该是MySQL reserved keywords
中的任何一个。因此,最好不要使用value
,而是使用myVal
或其他任何定义其中值的描述性名称。我将在下面的示例中使用myVal
。
您应该使用以下方法将查询转换为搜索模型,但在添加之前,您应该在搜索模型之上声明一个名为$myVal
的自定义字段,而不是使用andFilterWhere
对于相关模型,您应在joinWith()
函数中使用关系departments
在选择相关模型时指定它,或使用leftJoin
使用department
使用FIND_IN_SET
。 / p>
定义自定义字段
public $myVal;
然后在搜索模型中添加以下内容。
public function search(){
$query=Appraisel::find();
$query->select(new \yii\db\Expression('[[id]],group_concat(d.[[department]]) as myVal'));
$query->leftJoin('{{%department}} d', 'find_in_set(d.[[id]],{{%appraisal}}.[[dept]])');
$dataProvider = new ActiveDataProvider([
'query' => $query,
'pagination'=>[
'pageSize'=>20
]
]);
$query->groupBy(['{{%appraisal}}.[[id]]']);
return $dataProvider;
}
Hoipe它可以帮助你。