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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!