关于Yii2连表查询,子表数据不显示的问题

Rock
  • 9

在Order数据模型中:

public function getAdress(){
   //adress和id都是子表的部分
   return $this->hasOne(Adress::className(),['id'=>'adressid']);
 
}
 
public function getUser(){
 
   return $this->hasOne(User::className(),['userid'=>'userid']);
}

在控制器中:

//使用join进行连表查询(LEFT JOIN 左关联)
$orderInfoList = Order::find()
   ->select('shop_order.sn ,shop_user.username,shop_adress.consignee,shop_adress.telephone,shop_adress.adress,shop_order.amount,shop_order.orderstatus,shop_order.pay,shop_order.createtime,shop_order.finishtime')
   ->joinWith('adress')
   ->joinWith('user')
   ->orderBy('shop_order.createtime DESC');
 
//var_dump($orderInfoList);exit();
//$count = $orderInfoList->count();
 
 
//输出生成的SQL语句
$query = clone $orderInfoList;
echo $query->createCommand()->getRawSql();
 
//输出查询的结果
$m = $orderInfoList->all();
var_dump($m);exit();

这样写是可以查询的,使用echo $query->createCommand()->getRawSql();输出的数据库语句也是正确的:

SELECT `shop_order`.`sn`, `shop_user`.`username`, `shop_adress`.`consignee`, `shop_adress`.`telephone`, `shop_adress`.`adress`, `shop_order`.`amount`, `shop_order`.`orderstatus`, `shop_order`.`pay`, `shop_order`.`createtime`, `shop_order`.`finishtime` 
FROM `shop_order` LEFT JOIN `shop_adress` ON `shop_order`.`adressid` = `shop_adress`.`id` LEFT JOIN `shop_user` ON `shop_order`.`userid` = `shop_user`.`userid` 
ORDER BY `shop_order`.`createtime` DESC

从输出的数据库语句中可以看到语句中有子表的信息,我放到数据库软件中运行也可以查到对应的数据,但是目前的问题就是当我使用 $orderInfoList->all();进行全部数据查询时,不显示子表的信息

即:使用all()运行的结果就是会只有主表的信息(只有Order表的信息,没有adress和user表的信息)

希望能有大神解答,十分感谢!

回复
阅读 6.1k
4 个回答

你应该去看一下all方法的内部实现是不是过滤掉了非当前model的其他属性

如果用以下之類的方法取數据.不是可以嗎?

$m = $orderInfoList->all();
echo $m[0]->address->consignee;
...
->asArray()->all()
...

试一下

$m = $orderInfoList->asArray()->indexBy(function($row){
    return $row['sn'];
})->all();
var_dump($m);exit();
宣传栏