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();

谢谢你:)

  1. 您的第一个查询 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 的类型),则代码必须正常工作。

  1. 在第二个查询中,您可以使用 bindValues 而不是双 bindValue