yii2找到() - 它的用途是什么?

She*_*zod 2 database activerecord yii2

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

$players = PlayersModel::find()->with("countries")->all();
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

Biz*_*ley 9

with()Yii 2指南中有解释.

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

在你的例子中有PlayersModel.我假设还有ClubsModel代表数据库表中的数据clubs.

假设玩家属于其中一个俱乐部.PlayersModel和之间应该有明确的关系ClubsModel.如果在PlayersModel其中定义它可能是这样的:

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

所以现在有关系命名club.每次调用$model->club($model对象的位置PlayersModel)都会得到相关ClubsModel对象.

现在 - 当你寻找特定的玩家时:

$player = PlayersModel::find()->where(['id' => $id])->one();
Run Code Online (Sandbox Code Playgroud)

或者(写一点简单):

$player = PlayersModel::findOne($id);
Run Code Online (Sandbox Code Playgroud)

这是一个执行SQL查询.在下一步中,您希望获得此玩家的俱乐部 - 已经定义了关系,因此您可以致电:

$club = $player->club;
Run Code Online (Sandbox Code Playgroud)

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

假设您知道您需要将玩家数据与他的俱乐部数据一起使用 - 您可以使用with()以获得此信息:

$player = PlayersModel::find()->where(['id' => $id])->with('club')->one();
Run Code Online (Sandbox Code Playgroud)

这是一个SQL查询.现在你打电话的时候:

$club = $player->club;
Run Code Online (Sandbox Code Playgroud)

这次不需要第二次查询,因为已经获取了这个关系数据 - 它被称为急切加载.