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() 函数中指定它,在选择相关模型时使用关系 departmentsleftJoin 与 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;
}

希望它能帮到你。