YII 的 with 与 joinwith 的区别和使用
Yii框架中with 和 joinwith 的区别和使用
在YII中with和joinwith都是关联关系的使用,在我个人理解上来说with和joinwih的主要差别在于,with主要使用主表列
来查询主表数据
,当我们需要关联表的列
查询主表数据时我们就需要使用joinWith。
一. joinWith
$query = PackZone::find();
$query->joinWith(['sections']);
$query->andWhere(['pack_zone.storehouse_id' => $this->getStorehouseId()]);
$query->andFilterWhere(['like', 'section.name', strtoupper($form->section)]);
$query->groupBy('pack_zone.id');
- 在构建涉及 JOIN SQL 语句的连接查询时,清除列名的歧义很重要。 通常的做法是将表名称作为前缀加到对应的列名称前。
在dubug中可以看到该语句被yii翻译成
语句1:
- SELECT `pack_zone`.* FROM `pack_zone` LEFT JOIN `section` ON `pack_zone`.`id` = `section`.`pack_zone_id` WHERE (`pack_zone`.`storehouse_id`=1) AND (`section`.`name` LIKE '%CZ%') GROUP BY `pack_zone`.`id` ORDER BY `id` DESC LIMIT 100
语句2:
- SELECT * FROM `section` WHERE `pack_zone_id`=24
从语句1中可以明显的看出 使用关联表的列
做查询条件
来查询主表数据
二.with
$query = PackZone::find();
$query->with(['sections']);
$query->andWhere(['pack_zone.storehouse_id' => $this->getStorehouseId()]);
$query->andFilterWhere(['like', 'section.name', strtoupper($form->section)]);
$query->groupBy('pack_zone.id');
在dubug中可以看到该语句被yii翻译成
语句1
SELECT * FROM `pack_zone` WHERE `pack_zone`.`storehouse_id`=1 GROUP BY `pack_zone`.`id` ORDER BY `id` DESC LIMIT 100
语句2
SELECT * FROM `section` WHERE `pack_zone_id` IN (38, 31, 30, 29, 28, 27, 24)
joinWith :查询先查询出主表的数据,再去查关联表的查询,即使在启用即时加载的情况下使用joinwith或innerJoin(),
相应的关联数据也不会从这个join查询的结果中填充,因此每个连接关系还有一个额外的查询,和with的即时查询差不多
本作品采用《CC 协议》,转载必须注明作者和本文链接