【问题标题】:yii2 find with() - What is it for?yii2 find with() - 它有什么用?
【发布时间】:2017-04-26 12:44:44
【问题描述】:

也许这个问题很简单,但我无法理解 yii2 中的 with() 是什么,尽管我已经阅读了几篇关于它的文章。这是什么意思:

$players = PlayersModel::find()->with("countries")->all();

这是干什么用的?在我的数据库中(表是相关的)它可以用于什么目的:

请告诉我此功能的有用方面:with()

【问题讨论】:

    标签: database activerecord yii2


    【解决方案1】:

    with()Yii 2 Guide 中有解释。

    此方法允许在查询中急切加载关系数据。

    在您的示例中有PlayersModel。我假设还有 ClubsModel 代表来自数据库表 clubs 的数据。

    假设玩家属于某个俱乐部。 PlayersModelClubsModel 之间应该有定义的关系。如果它是在PlayersModel 中定义的,它可能是这样的:

    public function getClub()
    {
        return $this->hasOne(ClubsModel::className(), ['id' => 'id_club']);
    }
    

    所以现在有一个名为club 的关系。每次调用$model->club(其中$modelPlayersModel 的对象)时,您都会得到相关的ClubsModel 对象。

    现在 - 当您寻找特定的播放器时:

    $player = PlayersModel::find()->where(['id' => $id])->one();
    

    或者(写起来简单一点):

    $player = PlayersModel::findOne($id);
    

    这是一个执行的 SQL 查询。在下一步中,您想获得该玩家的俱乐部 - 已经定义了关系,因此您可以调用:

    $club = $player->club;
    

    但这会执行另一个 SQL 查询 - 它称为 延迟加载

    假设您知道您需要同时使用球员数据和他的俱乐部数据 - 您可以使用 with() 来获取:

    $player = PlayersModel::find()->where(['id' => $id])->with('club')->one();
    

    这是一个 SQL 查询。现在当你打电话时:

    $club = $player->club;
    

    这次不需要第二次查询,因为这个关系数据已经被获取了——它被称为eager loading

    【讨论】:

      猜你喜欢
      • 2014-10-25
      • 2016-03-05
      • 2015-09-13
      • 1970-01-01
      • 1970-01-01
      • 2017-03-19
      • 1970-01-01
      • 1970-01-01
      • 2017-11-21
      相关资源
      最近更新 更多