【问题标题】:pagination of SqlDataProvider not work me when use the call of a stored procededure使用存储过程的调用时,SqlDataProvider 的分页对我不起作用
【发布时间】:2020-01-10 01:15:11
【问题描述】:

我正在使用 SQLDataProvider 调用一个返回记录列表的过程,但我无法让它工作

我正在尝试的是:

 $dataProvider = new SqlDataProvider([
            'sql' => "CALL ErroresEnHoras(:project_id, :fecha_iniciop, :fecha_finp, :proyecto)",
            'params' =>
            [
                ':project_id' => ($this->proyectoid == '' || is_null($this->proyectoid)) ? 0 : $this->proyectoid,
                ':fecha_iniciop' => ($filtrosModel->fecha_inicio == '' ? null : $filtrosModel->fecha_inicio ),
                ':fecha_finp' => ($filtrosModel->fecha_fin == '' ? null : $filtrosModel->fecha_fin ),
                ':proyecto' => ($filtrosModel->proyecto == '' ? null : $filtrosModel->proyecto)
            ],
            'totalCount' => 335,
            'pagination' => [
                'pageSize' => 10,
            ],
        ]);

错误:

SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“LIMIT 10”附近使用正确的语法 正在执行的 SQL 是:CALL ErroresEnHoras(0, NULL, NULL, NULL) LIMIT 10

我知道为什么会出现错误,因为查询出错了。 还有其他方法吗?

非常感谢您

【问题讨论】:

  • 分页使用LIMIT,这适用于UPDATE/SELECT/DELETE 查询 - 但您正在调用不支持的存储过程。根据您的存储过程的作用,您可以切换到视图并从中进行选择
  • 如果过程返回的记录数量固定且很小,您可以尝试全部查询并使用ArrayDataProvider - 只要您没有处理数千条记录,它应该可以正常工作。

标签: stored-procedures pagination yii2 yii2-model csqldataprovider


【解决方案1】:

你的错误是,存储过程实际上并没有返回任何东西,而存储函数只返回一个值。所以没有直接的解决方案,即使是 ArrayDataProvider 也没有。

解决方法是使用中间表进行通信。您可以将唯一的查询 ID 传递给您的过程,然后将过程主体中的结果插入到带有查询 ID 的中间表中。

在中间表上使用数据提供程序。处理完成后,您可以从中间表中删除具有查询 ID 的记录。

【讨论】:

  • 这不是真的。确实,存储过程没有作为函数的返回值,但它们可以返回结果集。见这个例子db-fiddle.com/f/2vhVQUUUEsVHZrnnJePf14/0
  • @MichalHynčica 你是对的,但我没有看到在 Yii SQLDataProvider 中使用结果集的任何解决方案。
猜你喜欢
  • 1970-01-01
  • 2019-09-19
  • 1970-01-01
  • 1970-01-01
  • 2013-01-31
  • 2018-10-06
  • 2023-03-11
  • 2017-03-28
  • 1970-01-01
相关资源
最近更新 更多