@
vindurriel with 语句是逻辑联表查询,一次查询的确需要执行 1+1 次 SQL,它类似于 ActiveRecord 型的 ORM 中的 hasMany 设定,相对 ORM 优点是不用生成大量对象也不用写 model 模型代码定义每个表和表之间关系。
写一个简单的例子,像 v2 这样的社区有多个主题贴子,每一个主题也有多个回复评论,如果我一次想要查询自己所有的主题贴子和所有的主题贴子的回复评论回复怎么办?
用常规写法,先查询所有的主题贴,再循环查询每个主题贴的回复评论
$posts = $this->db->post->where('name', 'qiujin')->find();
foreach ($posts as $i => $post) {
$posts[$i] = $this->db->comment->where('post_id', $post['id'])->find();
}
return $posts;
使用 with 语句一行代码即可。
return $this->db->post->where('name', 'qiujin')->with('comment')->find();
对比就可以知道常规写法不仅啰嗦,而且低效,因为常规写法执行了 1+N 次 SQL。
而 with 语句简洁明了,查询 post 数据后,在把 post 数据中的 id 抽出组成 where in 查询 comment 表数据,最后把 comment 数据组合分配给 post 返回,其中只执行了 1+1 次 SQL,比常规写法效率高很多。