YII 的 with 與 joinwith 的區別和使用

lcgwhat發表於2019-09-24

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 協議》,轉載必須註明作者和本文連結

相關文章