【问题标题】:Yii2 How create ActiveDataProvider with union from different modelsYii2 如何使用不同模型的联合创建 ActiveDataProvider
【发布时间】:2015-10-13 09:10:01
【问题描述】:

我正在尝试从两个不同的模型创建联合,当将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 上运行它并返回结果!

控制器代码下方:

$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,
]);

【问题讨论】:

  • 不确定 ActiveRecord 是否有 union 方法尝试使用 merge 结果,如果没有尝试使用 QueryBuilder .您可能还需要this open issue 中的 mdmunir 解决方案
  • 可以使用SqlDataProvider

标签: sql-server gridview yii2 union dataprovider


【解决方案1】:

我在最终代码下方使用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,
    ],          
]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多