Yii2 如何使用来自不同模型的联合创建 ActiveDataProvider
Yii2 How create ActiveDataProvider with union from different models
我正在尝试从两个不同的模型创建联合,这两个模型在将 dataProvider
发送到 GridView
时在错误下方具有相同的列 id, body
:
SQLSTATE[07002]: [Microsoft][ODBC Driver 11 for SQL Server]COUNT field incorrect or syntax error
The SQL being executed was: SELECT COUNT(*) FROM ((SELECT [id], [body] FROM [web_article] WHERE body LIKE '%a%') UNION ( SELECT [id], [body] FROM [email_article] WHERE body LIKE '%a%' )) [c]
我复制了 sql
查询然后 运行 它在 MSSQL Server
上 return 结果!
控制器代码下方:
$model = new DynamicModel([
'text', 'type'
]);
$model->addRule(['text'], 'required')
->addRule('text', 'string');
$emailArticle = EmailArticle::find()->select('id, body')->where('body LIKE :query')->addParams([':query'=>"%{$model->text}%"]);
$webArticle = WebArticle::find()->select('id, body')->where('body LIKE :query')->addParams([':query'=>"%{$model->text}%"]);
$webArticle->union($emailArticle);
$dataProvider = new ActiveDataProvider([
'query' => $webArticle,
'pagination' => [
'pageSize' => 21,
],
]);
return $this->render('form', [
'model'=>$model,
'dataProvider' => $dataProvider,
]);
我在最终代码下面使用SqlDataProvider
而不是ActiveDataProvider
:
$sql = "(SELECT [id], [body] FROM [web_article] WHERE body LIKE '%{$model->text}%' UNION SELECT [id], [body] FROM [email_article] WHERE body LIKE '%{$model->text}%')";
$totalCount = \Yii::$app->db->createCommand("SELECT COUNT(*) FROM $sql AS [c]")->queryScalar();
$dataProvider = new SqlDataProvider([
'sql' => $sql . ' ORDER BY body',
'totalCount' => (int)$totalCount,
'pagination' => [
'pageSize' => 20,
],
]);
我正在尝试从两个不同的模型创建联合,这两个模型在将 dataProvider
发送到 GridView
时在错误下方具有相同的列 id, body
:
SQLSTATE[07002]: [Microsoft][ODBC Driver 11 for SQL Server]COUNT field incorrect or syntax error
The SQL being executed was: SELECT COUNT(*) FROM ((SELECT [id], [body] FROM [web_article] WHERE body LIKE '%a%') UNION ( SELECT [id], [body] FROM [email_article] WHERE body LIKE '%a%' )) [c]
我复制了 sql
查询然后 运行 它在 MSSQL Server
上 return 结果!
控制器代码下方:
$model = new DynamicModel([
'text', 'type'
]);
$model->addRule(['text'], 'required')
->addRule('text', 'string');
$emailArticle = EmailArticle::find()->select('id, body')->where('body LIKE :query')->addParams([':query'=>"%{$model->text}%"]);
$webArticle = WebArticle::find()->select('id, body')->where('body LIKE :query')->addParams([':query'=>"%{$model->text}%"]);
$webArticle->union($emailArticle);
$dataProvider = new ActiveDataProvider([
'query' => $webArticle,
'pagination' => [
'pageSize' => 21,
],
]);
return $this->render('form', [
'model'=>$model,
'dataProvider' => $dataProvider,
]);
我在最终代码下面使用SqlDataProvider
而不是ActiveDataProvider
:
$sql = "(SELECT [id], [body] FROM [web_article] WHERE body LIKE '%{$model->text}%' UNION SELECT [id], [body] FROM [email_article] WHERE body LIKE '%{$model->text}%')";
$totalCount = \Yii::$app->db->createCommand("SELECT COUNT(*) FROM $sql AS [c]")->queryScalar();
$dataProvider = new SqlDataProvider([
'sql' => $sql . ' ORDER BY body',
'totalCount' => (int)$totalCount,
'pagination' => [
'pageSize' => 20,
],
]);