gpt4 book ai didi

php - 从 Yii2 中的联结表中检索数据

转载 作者:IT老高 更新时间:2023-10-29 00:21:16 28 4
gpt4 key购买 nike

我正在尝试从 Yii2 中的连接表中获取数据,而无需额外的查询。我有 2 个模型(用户、组)通过联结表 (user_group) 关联。在 user_group 表中,我想为这个关系存储额外的数据(管理标志,...)。

  • 将数据添加到联结表的最佳方法是什么?链接方法接受参数 extraColumns,但我不知道它是如何工作的。

  • 检索此数据的最佳方法是什么?我编写了一个额外的查询以从联结表中获取值。一定有更简洁的方法来做到这一点?!

仅供引用,这是我在模型中定义关系的方式:

组.php

public function getUsers() {
return $this->hasMany(User::className(), ['id' => 'user_id'])
->viaTable('user_group', ['group_id' => 'id']);
}

用户.php

public function getGroups() {
return $this->hasMany(Group::className(), ['id' => 'group_id'])
->viaTable('user_group', ['user_id' => 'id']);
}

最佳答案

简而言之:像您建议的那样为联结表使用 ActiveRecord 是正确的方法,因为您可以设置 via()使用现有的 ActiveRecord。这允许您使用 Yii 的 link() 方法在联结表中创建项目,同时添加数据(如您的管理员标志)。


官方的 Yii Guide 2.0 规定了两种使用联结表的方法:使用 viaTable() 和使用 via()(参见 here )。前者期望连接表的名称作为参数,而后者期望关系名称作为参数。

如果您需要访问联结表中的数据,我会按照您的建议为联结表使用 ActiveRecord 并使用 via():

class User extends ActiveRecord
{
public function getUserGroups() {
// one-to-many
return $this->hasMany(UserGroup::className(), ['user_id' => 'id']);
}
}

class Group extends ActiveRecord
{
public function getUserGroups() {
// one-to-many
return $this->hasMany(UserGroup::className(), ['group_id' => 'id']);
}

public function getUsers()
{
// many-to-many: uses userGroups relation above which uses an ActiveRecord class
return $this->hasMany(User::className(), ['id' => 'user_id'])
->via('userGroups');
}
}

class UserGroup extends ActiveRecord
{
public function getUser() {
// one-to-one
return $this->hasOne(User::className(), ['id' => 'user_id']);
}

public function getGroup() {
// one-to-one
return $this->hasOne(Group::className(), ['id' => 'userh_id']);
}
}

通过这种方式,您无需使用 userGroups 关系(与任何其他一对多关系一样)进行额外查询即可获取联结表的数据:

$group = Group::find()->where(['id' => $id])->with('userGroups.user')->one();
// --> 3 queries: find group, find user_group, find user
// $group->userGroups contains data of the junction table, for example:
$isAdmin = $group->userGroups[0]->adminFlag
// and the user is also fetched:
$userName = $group->userGroups[0]->user->name

这一切都可以使用 hasMany 关系来完成。所以你可能会问为什么要使用 via() 声明多对多关系:因为你可以使用 Yii 的 link() 方法在联结表中创建项目:

$userGroup = new UserGroup();
// load data from form into $userGroup and validate
if ($userGroup->load(Yii::$app->request->post()) && $userGroup->validate()) {
// all data in $userGroup is valid
// --> create item in junction table incl. additional data
$group->link('users', $user, $userGroup->getDirtyAttributes())
}

关于php - 从 Yii2 中的联结表中检索数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28525945/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com