也许这个问题非常简单但我无法理解yii2中的 with(),尽管我已经阅读过几篇关于它的文章。这是什么意思:
$players = PlayersModel::find()->with("countries")->all();
这是为了什么?在我的数据库(哪些表是相关的)中可以使用它的目的:
请告诉我此功能的有用方面:with()
答案 0 :(得分:8)
with()
。
此方法允许在查询中急切加载关系数据。
在您的示例中,有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;
这次不需要第二次查询,因为已经提取了这个关系数据 - 它被称为急切加载。