Yii2: joinWith andFilterWhere with find_in_set
Yii2: joinWith andFilterWhere with find_in_set
我正在尝试像这样转换 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 的 table 结构是
--
-- 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 部门结构是
--
-- 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`);
在评估 table, appraisal.dept 中,值以逗号分隔的形式存储,如 1,2,33,4
。还有如何为 departments
字段
应用 andFilterWhere
条件
使用别名时要小心,别名不能是 MySQL reserved keywords
中的任何一个。因此,最好不要使用 value
,而是使用任何其他类似 myVal
或定义其中值的更具描述性的名称。我将在下面的示例中使用 myVal
。
您应该使用以下方式将查询转换为搜索模型,但在添加它之前,您应该在搜索模型之上声明一个名为 $myVal
的自定义字段,而不是使用 andFilterWhere
对于相关模型,您应该在 joinWith()
函数中指定它,在选择相关模型时使用关系 departments
或 leftJoin
与 table department
使用 FIND_IN_SET
.
定义自定义字段
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;
}
希望它能帮到你。
我正在尝试像这样转换 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 的 table 结构是
--
-- 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 部门结构是
--
-- 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`);
在评估 table, appraisal.dept 中,值以逗号分隔的形式存储,如 1,2,33,4
。还有如何为 departments
字段
andFilterWhere
条件
使用别名时要小心,别名不能是 MySQL reserved keywords
中的任何一个。因此,最好不要使用 value
,而是使用任何其他类似 myVal
或定义其中值的更具描述性的名称。我将在下面的示例中使用 myVal
。
您应该使用以下方式将查询转换为搜索模型,但在添加它之前,您应该在搜索模型之上声明一个名为 $myVal
的自定义字段,而不是使用 andFilterWhere
对于相关模型,您应该在 joinWith()
函数中指定它,在选择相关模型时使用关系 departments
或 leftJoin
与 table department
使用 FIND_IN_SET
.
定义自定义字段
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;
}
希望它能帮到你。