Yii2:joinWith和FilterWhere with find_in_set

时间:2018-02-22 11:30:20

标签: mysql yii2 yii2-model

我正在尝试转换像这样的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条件

1 个答案:

答案 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它可以帮助你。