ActiveQuery to array(asArray)

时间:2016-12-19 14:23:19

标签: php yii2

该查询有什么问题?

$numery = Number::find()
        ->select('number.phone_number')
        ->from('number')
        ->leftJoin('ordered_number', ['ordered_number.number_id' => 'number.phone_number'])
        ->where(['ordered_number.order_id' => 123])
        ->asArray();

我不确定asArray是否以良好的方式使用,如果我必须使用 one() all()结束查询,因为所有示例我见过它。

我把它改为:

        $numery = Number::find()
                ->select('number.phone_number')
                ->from('number, ordered_number')
                ->where(['ordered_number.number_id' => 'number.id'])
                ->andWhere(['ordered_number.order_id' => 123])
                ->asArray()
                ->all();

但我仍然得到NULL而不是4元素数组。当我删除“where”部分时,我得到了我拥有的所有数字,所以我想某处存在问题。 在原始MySQL中工作的查询和我想要使用的查询如下所示:

SELECT number.phone_number 
FROM number, ordered_number 
WHERE ordered_number.number_id=number.id 
AND ordered_number.order_id=123

2 个答案:

答案 0 :(得分:1)

关于第一个

$numery = Number::find()
    ->select('number.phone_number')
    ->from('number')
    ->leftJoin('ordered_number', ['ordered_number.number_id' => 'number.phone_number'])
    ->where(['ordered_number.order_id' => 123])
    ->asArray();

您需要使用one()all()结束,具体取决于您希望获得的结果数量。
one()为您提供单个数据库行,all()为您提供数据库行数 如果没有asArray(),它会为您提供对象(或all()的情况下的对象数组) - 使用asArray()它会明显地为您提供数组(或数组数组)。

还有一件事 - 当您使用Model::find()静态方法时,您不必设置from(),因为它会自动使用模型的基础数据库表。

更新leftJoin错误 - 应该是

->leftJoin('ordered_number', 'ordered_number.number_id = number.phone_number')

关于第二一:

$numery = Number::find()
            ->select('number.phone_number')
            ->from('number, ordered_number')
            ->where(['ordered_number.number_id' => 'number.id'])
            ->andWhere(['ordered_number.order_id' => 123])
            ->asArray()
            ->all();

您在from()中添加了两个表格。此方法指出,在这种情况下,yu应该使用数组而不是字符串:

->from(['number', 'ordered_number'])

答案 1 :(得分:0)

在您的代码中$numery最终持有ActiveQuery方法创建的find()对象,并在其后的其他方法中进行修改。

您需要在最后使用one()all()方法,以便执行查询并返回查询结果。

asArray()方法只是告诉ActiveQuery对象将其结果作为数组而不是对象或对象数组返回。