Model yii2-默认情况下使用联接表过滤模型

Model yii2-默认情况下使用联接表过滤模型,model,yii2,filtering,Model,Yii2,Filtering,我在Yii2积极发展。我有个问题。我没有找到任何关于这个的信息 我关于默认过滤模型的问题。 例如,我有一个类别和分配给该类别的项目。并不是所有用户都可以访问所有类别。创建类别时,有一个选项,您可以在其中为用户设置访问权限 那么,如何为类别模型设置全局过滤器?无论我在哪里请求分类列表,我都会根据用户访问权限接收它。当然,我可以编写自己的方法,而不是find->,findAll。。。但也许还有另一种解决方案,更符合yii2的标准 谢谢你的帮助 更新1 具有覆盖查找方法的Sulotion。但valid

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

我关于默认过滤模型的问题。 例如,我有一个类别和分配给该类别的项目。并不是所有用户都可以访问所有类别。创建类别时,有一个选项,您可以在其中为用户设置访问权限

那么,如何为类别模型设置全局过滤器?无论我在哪里请求分类列表,我都会根据用户访问权限接收它。当然,我可以编写自己的方法,而不是find->,findAll。。。但也许还有另一种解决方案,更符合yii2的标准

谢谢你的帮助

更新1

具有覆盖查找方法的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但仍然捕获where子句中的1052列“id”是不明确的

更新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
所以,我想做的是根据授权用户的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')

始终可以在模型类内重写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();
    }
}

在使用联接表的情况下,在创建项期间,validateAttributes方法存在问题。GET错误完整性约束冲突:查询中where子句中的1052列“id”不明确SELECT EXISTSSELECT p.*FROM tm_projects p LEFT JOIN tm_projects\u ACCESS pa ON pa.project\u id=p.id,其中pa.user\u id(如“%37%”和id='6')覆盖了可以在我更新的假定我的帖子中找到的查找方法。当我尝试在where子句中创建新的项目1052列“id”时,仍然捕获到与onCondition相同的错误。再次使用有关我的问题的更多日期更新了我的帖子这是另一个问题。看见我想你把它和我的生活混在一起了。查看更多详细信息。它与Yii1相关,但同样适用于Yii2。使用查询生成器时,可以获得性能,但会丢失AR功能。
class CategoryQuery extends \yii\db\ActiveQuery
{
    public function init()
    {
        $this->andOnCondition([['owner_id' => Yii::$app->user->id]]);
        parent::init();
    }
}