我有类似的东西
$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()也已经过定制,到现在为止一直运作良好。
答案 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();
这将为您提供所有列