Yii2 Query类不返回其他列

时间:2018-03-30 07:08:57

标签: php orm yii2

我有类似的东西

$query = Customer::find()
                ->select(['customer.name', 'surname', 'cityName' => 'cities.name', 'streetName' => 'streets.name'])
                ->joinWith(['city', 'street'])
                ->where(['group_id' => $id]);

当我做的时候

return $query->all();

它只返回来自customer表的列,但是当我做这样的事情时

$raw = $query->createCommand()->getRawSql();
return \Yii::$app->user_db->createCommand($raw)->queryAll();

它返回了我所有4列。为什么orm失败了? 我正在使用自定义数据库连接(用户),授权后动态连接。无论如何,ActiveRecord-> getDb()也已经过定制,到现在为止一直运作良好。

2 个答案:

答案 0 :(得分:1)

  

它只返回来自customer表的列,但是当我做这样的事情时。

是的,没错。因为Yii2 AR(Active Record)是ORM模式。并且它尝试将所有结果从对象返回查询。

所以,我不会说理论,我最好建议一个解决方案变体:

$query = Customer::find()
            ->joinWith(['city', 'street'])
            ->where(['group_id' => $id])
            ->asArray()
            ->all();
return $query;

来自Yii2 docs(performance tuning)

结果如下:

[
    all data selected from "customer",
    ['city' => all data selected from city joinWith],
    ['street' => all data selected from street joinWith]
]

我想,这正是你所需要的。 但是,如果您需要对象。您可以尝试将对象仅限于一个数组。

$customer = Customer::find()
            ->joinWith(['city', 'street'])
            ->where(['group_id' => $id])
            ->all();
return [
    'customer' => $customer,
    'city' => $customer->city,
    'street' => $customer->street,
];

答案 1 :(得分:0)

您正在使用

 ->select(['customer.name', 'surname', 'cityName' => 'cities.name', 'streetName' => 'streets.name'])

因此您只会获得选定的列。 使用,

 $query = Customer::find()
        ->joinWith(['city', 'street'])
        ->where(['group_id' => $id])
        ->all();

这将为您提供所有列