Stored procedures 使用存储过程调用时,SqlDataProvider的分页不起作用
我正在使用SQLDataProvider调用一个过程,该过程返回一个记录列表,但我无法让它工作 我尝试的是:Stored procedures 使用存储过程调用时,SqlDataProvider的分页不起作用,stored-procedures,pagination,yii2,yii2-model,csqldataprovider,Stored Procedures,Pagination,Yii2,Yii2 Model,Csqldataprovider,我正在使用SQLDataProvider调用一个过程,该过程返回一个记录列表,但我无法让它工作 我尝试的是: $dataProvider = new SqlDataProvider([ 'sql' => "CALL ErroresEnHoras(:project_id, :fecha_iniciop, :fecha_finp, :proyecto)", 'params' => [
$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是:调用ErroresEnHoras(0,NULL,NULL,NULL)LIMIT 10
我知道为什么会出错,因为查询出错了。
还有别的办法吗
事先非常感谢您的错误是,存储过程实际上不返回任何内容,而存储函数只返回一个值。因此,没有直接的解决方案,即使使用ArrayDataProvider也不行 解决方法是使用中间表进行通信。您可以向过程传递一个唯一的查询ID,然后将过程主体中的结果插入到具有查询ID的中间表中
使用中间表上的数据提供程序。处理完成后,您可以从中间表中删除带有查询ID的记录。您的错误是,存储过程实际上不返回任何内容,而存储函数只返回一个值。因此,没有直接的解决方案,即使使用ArrayDataProvider也不行 解决方法是使用中间表进行通信。您可以向过程传递一个唯一的查询ID,然后将过程主体中的结果插入到具有查询ID的中间表中
使用中间表上的数据提供程序。处理完成后,您可以从中间表中删除带有查询ID的记录。分页使用
限制
,这在更新
/选择
/删除
查询时可以正常工作-但您正在调用一个不支持该操作的存储过程。根据存储过程的功能,您可以切换到视图并从中进行选择。如果过程返回的记录数固定且较小,您可以尝试查询所有记录并使用ArrayDataProvider
-只要您没有数千条记录,它就可以正常工作。分页使用LIMIT
,这适用于更新
/选择
/删除
查询-但您正在调用一个不支持该操作的存储过程。根据存储过程的功能,您可以切换到一个视图并从中进行选择。如果存储过程返回的记录数固定且较小,您可以尝试查询所有记录并使用ArrayDataProvider
——只要您没有数千条记录,它就可以正常工作。这不是真的。存储过程确实没有函数返回值,但它们可以返回结果集。看到这个例子@MichalHynčica你是对的,但是我没有看到任何在Yii SQLDataProvider中使用结果集的解决方案。这不是真的。存储过程确实没有函数返回值,但它们可以返回结果集。看到这个例子@MichalHynčica你是对的,但是我没有看到任何在Yii SQLDataProvider中使用结果集的解决方案。