zoukankan      html  css  js  c++  java
  • Yii2 with 和 joinWith 的区别

    转载

    先确保 Topic 有 getComments() 方法

    class Topic extends yiidbActiveRecord
    {
        ...
        public function getComments()
        {
            return $this->hasMany(Comment::className(), ['topic_id' => 'id']);
        }
    }
    

      

    joinWith()

    Topic::find()->joinWith('comments');
    
    // 输出的 SQL
    SELECT `topic`.* FROM `topic` LEFT JOIN `comment` ON `topic`.`id` = `comment`.`topic_id`
    

      

    with()

    Topic::find()->with('comments');
    
    // 输出的 SQL
    SELECT * FROM `topic`
    SELECT * FROM `comment` WHERE `topic_id` IN (1, 2, 3, 4, 5)
    

      

    而针对于这两者,官网上是这样说的:

    yiidbActiveQuery::joinWith() 和 yiidbActiveQuery::with() 的区别是 前者连接主模型类和关联模型类的数据表来检索主模型, 而后者只查询和检索主模型类。 检索主模型

    由于这个区别,你可以应用只针对一条 JOIN SQL 语句起效的查询条件。 如,通过关联模型的查询条件过滤主模型,如前例, 可以使用关联表的列来挑选主模型数据,

    用我自己的语言,总结如下:

    注意: 我把关联表,叫做 "副表",

    1. 当你使用关联查询的时候, 你想排除掉副表不满足的条件下, 主表也给排除掉, 那么我们这时候就选 JoinWith
    2. 当你不介意对应的副表是否满足条件时, 只需要把主表显示出来就行了, 那么我们这时就选with
    3. 你观察sql,你会发现, 用with的时候, 没有with对应的sql语句, 而JoinWith对应的sql语句是存在的, 这点可以注意一下

  • 相关阅读:
    Appium
    monkeyrunner
    Weex
    linux:合并类别代码,查看文本文件的头部、尾部行内容 及查看行数
    linux:使用screen防止异常中断
    Nginx Server 配置格式
    请求测试BTC
    This request has been blocked; the content must be served over HTTPS
    npm install:sill install loadAllDepsIntoIdealTree 不继续执行
    VSCode Remote-WSL 修改子系统版本
  • 原文地址:https://www.cnblogs.com/jimz/p/9974456.html
Copyright © 2011-2022 走看看