Yii,查询给出数组到字符串错误
Yii, querying gives array to string error
$paymentIDs = Yii::app()->db->createCommand('SELECT payment_id FROM client_package WHERE package_id = :pid AND payment_id IS NOT NULL')->bindValue(':pid', $pid)->queryAll();
$total = Yii::app()->db->createCommand('SELECT count(*) FROM payment WHERE id IN ('.implode(",", $paymentIDs).') AND date BETWEEN \':mS\' AND \':mE\'')->bindValue(':mS', $monthStart)->bindValue(':mE', $monthEnd)->queryScalar();
以上是我查询的代码。如您所见,我根据特定条件查询了 payment_id
(s)。我现在有一组数字。
当我执行第二个查询时,它失败了,抛出一个错误
Array to String conversion
我也试过这个:
$total = Yii::app()->db->createCommand('SELECT count(*) FROM payment WHERE id IN ('.implode(",", $paymentIDs['payment_id']).') AND date BETWEEN \':mS\' AND \':mE\'')->bindValue(':mS', $monthStart)->bindValue(':mE', $monthEnd)->queryScalar();
现在,这给了我一个错误提示:
Undefined index: payment_id
有人可以指出我的错误吗?非常感谢您的帮助。
谢谢。
第一个查询的结果 $paymentIDs
是一个数组数组(或普通对象,我不确定)。您可以尝试在 IDE 中检查它,或者简单地使用 var_dump
来查看其结构。您可以使用 listData
method of the CHtml class 来更接近您想要的内容,如下所示:
$ids = CHtml::listData($paymentIDs, 'payment_id', 'payment_id');
这会将您的数组展平为字符串数组。那么...
implode(",", $ids)
...会给你想要的结果。
您可以像这样使用单个查询来解决此问题:
$total = Yii::app()->db->createCommand('SELECT count(*) FROM payment WHERE id IN (SELECT payment_id FROM client_package WHERE package_id = :pid AND payment_id IS NOT NULL) AND date BETWEEN \':mS\' AND \':mE\'')->bindValue(':pid', $pid)->bindValue(':mS', $monthStart)->bindValue(':mE', $monthEnd)->queryScalar();
谢谢你:)
- 您的第一个查询 returns 对象数组(不是
payment_id
数组)。
要获取某些列的值数组,您可以使用 ->queryColumn()
。
所以第一个查询必须是:
$paymentIDs = Yii::app()->db->createCommand('SELECT payment_id FROM client_package WHERE package_id = :pid AND payment_id IS NOT NULL')->bindValue(':pid', $pid)->queryColumn()
如果变量 $monthStart
和 $monthEnd
具有 string
类型(或可以转换为 string
的类型),则代码必须正常工作。
- 在第二个查询中,您可以使用
bindValues
而不是双 bindValue
。
$paymentIDs = Yii::app()->db->createCommand('SELECT payment_id FROM client_package WHERE package_id = :pid AND payment_id IS NOT NULL')->bindValue(':pid', $pid)->queryAll();
$total = Yii::app()->db->createCommand('SELECT count(*) FROM payment WHERE id IN ('.implode(",", $paymentIDs).') AND date BETWEEN \':mS\' AND \':mE\'')->bindValue(':mS', $monthStart)->bindValue(':mE', $monthEnd)->queryScalar();
以上是我查询的代码。如您所见,我根据特定条件查询了 payment_id
(s)。我现在有一组数字。
当我执行第二个查询时,它失败了,抛出一个错误
Array to String conversion
我也试过这个:
$total = Yii::app()->db->createCommand('SELECT count(*) FROM payment WHERE id IN ('.implode(",", $paymentIDs['payment_id']).') AND date BETWEEN \':mS\' AND \':mE\'')->bindValue(':mS', $monthStart)->bindValue(':mE', $monthEnd)->queryScalar();
现在,这给了我一个错误提示:
Undefined index: payment_id
有人可以指出我的错误吗?非常感谢您的帮助。
谢谢。
第一个查询的结果 $paymentIDs
是一个数组数组(或普通对象,我不确定)。您可以尝试在 IDE 中检查它,或者简单地使用 var_dump
来查看其结构。您可以使用 listData
method of the CHtml class 来更接近您想要的内容,如下所示:
$ids = CHtml::listData($paymentIDs, 'payment_id', 'payment_id');
这会将您的数组展平为字符串数组。那么...
implode(",", $ids)
...会给你想要的结果。
您可以像这样使用单个查询来解决此问题:
$total = Yii::app()->db->createCommand('SELECT count(*) FROM payment WHERE id IN (SELECT payment_id FROM client_package WHERE package_id = :pid AND payment_id IS NOT NULL) AND date BETWEEN \':mS\' AND \':mE\'')->bindValue(':pid', $pid)->bindValue(':mS', $monthStart)->bindValue(':mE', $monthEnd)->queryScalar();
谢谢你:)
- 您的第一个查询 returns 对象数组(不是
payment_id
数组)。 要获取某些列的值数组,您可以使用->queryColumn()
。 所以第一个查询必须是:
$paymentIDs = Yii::app()->db->createCommand('SELECT payment_id FROM client_package WHERE package_id = :pid AND payment_id IS NOT NULL')->bindValue(':pid', $pid)->queryColumn()
如果变量 $monthStart
和 $monthEnd
具有 string
类型(或可以转换为 string
的类型),则代码必须正常工作。
- 在第二个查询中,您可以使用
bindValues
而不是双bindValue
。