Yii2活动记录:显示相关记录的最佳方式

Yii2活动记录:显示相关记录的最佳方式,yii,yii2,Yii,Yii2,我有两个表:record、user和一个连接表record\u user。我使用活动记录显示与已登录用户相关的记录 在model User中,我具有以下功能: public function getRecordUsers() { return $this->hasMany(RecordUser::className(), ['user_id' => 'id']); } public function getRecords() { return $this->h

我有两个表:recorduser和一个连接表record\u user。我使用活动记录显示与已登录用户相关的记录

在model User中,我具有以下功能:

public function getRecordUsers()
{
    return $this->hasMany(RecordUser::className(), ['user_id' => 'id']);
}

public function getRecords()
{
    return $this->hasMany(Record::className(), ['id' => 'record_id'])
        ->via('recordUsers');
}
见:

在model RecordSearch中,我定义了活动数据提供程序的查询:

public function search($params)
{

// The Object with all records, to which has the user access (the id of the user is in the junction table record_user).
$loggedUserRecords = YiiUser::findOne(Yii::$app->user->identity->id)->records;

// From the object is extracted an array with ids.
$loggedUserRecordsIds = yii\helpers\ArrayHelper::getColumn($loggedUserRecords, 'id');

// The ids are used to filter the Record object.
$query = Record::find()->filterWhere(['id' => $loggedUserRecordsIds]);

$dataProvider = new ActiveDataProvider([
    'query' => $query,
]);
...

代码按预期工作。但是我想知道,是否有一种更直接的方式来显示相关记录,而无需从对象中提取ID。

我想RecordSearch有这种关系

public function getRecordUsers()
{
    return $this->hasMany(RecordUser::className(), ['record_id' => 'id']);
}

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

然后,您应该能够检查以下查询:

$dataProvider = new ActiveDataProvider([
    'query' => Record::find()->joinWith(['users'])->where(['user_id'=> Yii::$app->user->identity->id]),
]);

如果我没有犯错误。

正如bSoft建议的那样,最快、最简单的方法可能是以下方法

模型记录:

public function getRecordUsers()
{
    return $this->hasMany(RecordUser::className(), ['record_id' => 'id']);
}
模型记录搜索:

$dataProvider = new ActiveDataProvider([
    'query' => Record::find()->joinWith(['recordUsers'])->where(['user_id'=> Yii::$app->user->identity->id]),
]);

为什么不将createdBy、updatedBy列添加到记录模型和表中呢?然后您只需在这里查询
过滤器['createdBy'=>$user\u id]
?记录仅由管理员管理,管理员有权访问所有记录(在后端)。管理员决定谁应该查看哪些记录(在前端)。在我的表中,我也有创建人、更新人等字段,但这些字段在本例中没有用处。问题中的代码经过简化和重写,很容易理解。我忘了提到,一条记录可以访问0-n个用户。非常感谢。它工作得很好。我现在使用:$query=Record::find()->joinWith(['users'])->where(['user\u id'=>Yii::$app->user->identity->id]);如果我没记错的话,您也可以尝试连接到recordUsers表并在那里添加条件。这将减少查询一个表的时间。
$dataProvider = new ActiveDataProvider([
    'query' => Record::find()->joinWith(['recordUsers'])->where(['user_id'=> Yii::$app->user->identity->id]),
]);