yii2 - 默认情况下使用连接表

时间:2017-01-24 11:48:53

标签: model yii2 filtering

我在Yii2积极发展。我有一个问题。我没有找到任何相关的信息。

我的问题是默认过滤模型。 例如,我有一个分类到类别的类别和项目。并且没有任何用户可以访问所有类别。创建类别时,可以选择为用户设置访问权限。

那么,如何为类别模型设置全局过滤器?那,无论我在哪里请求类别列表 - 我都会根据用户访问权限来回收它。当然我可以编写我自己的方法insiet() - >,findAll()...但也许还有另一种解决方案,对于yii2更为规范

感谢您的帮助!

更新了#1

使用覆盖find()方法进行Sulotion。但是validateAttributes()方法的问题

public static function find()
{
    $query = new ProjectsQuery(get_called_class());

    $query->alias('p')
        ->leftJoin(ProjectsAccessibility::tableName().' pa','pa.project_id=p.id')
        ->andWhere(['like','pa.user_id',Yii::$app->user->id]);

    return $query;
}

更新了#2

使用joinCondition()但仍然在捕捉1052 Column 'id' in where clause is ambiguous

public static function find()
{
    $query = new ProjectsQuery(get_called_class());

    $query->joinWith([
        'projectsAccessibility' => function($query){
            $query->onCondition(['user_id' => Yii::$app->user->id]);
        },
    ]);

    return $query;
}

更新了#3

让我更详细地解释一下我的问题。我正在创建一个项目经理系统。因此,我列出了分配给项目的项目任务。 并且还有一个表,其中包含用户和项目之间的访问信息:

Projects
id | name
1    Project 1
2    Project 2

Tasks
id | project_id | name
1          1      Task 1 
2          2      Task 2

Users
id | name
1    User 1 
2    User 2

Project Access
id | user_id | project_id
1      2           1
2      2           2 
3      1           1

所以,我要做的是根据授权的user_id显示项目和任务列表,现在它正在运行。但是当我用连接表覆盖find()方法时,当我尝试创建一个新任务时,我得到了mysql错误,在save()yii2中检查所有属性(如果存在),但它不知道在find()方法中使用相同的连接表列名称 - id

完整的错误消息:

SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'id' in where clause is ambiguous
The SQL being executed was: SELECT EXISTS(SELECT tm_projects.* FROM tm_projects LEFT JOIN tm_projects_accessibility ON (tm_projects.id = tm_projects_accessibility.project_id) AND (user_id=37) WHERE id='1')

1 个答案:

答案 0 :(得分:2)

您始终可以覆盖模型类中的find()方法:

public static function find()
{
    return parent::find()->onCondition(['owner_id' => Yii::$app->user->id]);
}

或者,如果您已经覆盖它,则使用 ActiveQuery 类,如:

public static function find()
{
    return new \app\models\CategoryQuery(get_called_class());
}

然后您可以使用该类的init()方法来定义默认过滤器:

class CategoryQuery extends \yii\db\ActiveQuery
{
    public function init()
    {
        $this->andOnCondition([['owner_id' => Yii::$app->user->id]]);
        parent::init();
    }
}