with() 在Yii 2 Guide 中有解释。
此方法允许在查询中急切加载关系数据。
在您的示例中有PlayersModel。我假设还有 ClubsModel 代表来自数据库表 clubs 的数据。
假设玩家属于某个俱乐部。 PlayersModel 和ClubsModel 之间应该有定义的关系。如果它是在PlayersModel 中定义的,它可能是这样的:
public function getClub()
{
return $this->hasOne(ClubsModel::className(), ['id' => 'id_club']);
}
所以现在有一个名为club 的关系。每次调用$model->club(其中$model 是PlayersModel 的对象)时,您都会得到相关的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。