Yii2 RBAC GII 完整性约束违反

Yii2 RBAC GII Integrity Constraint Violation

到处找这个,一无所获。

我正在使用 Yii2 的迁移来为 RBAC 添加数据库表,它们创建得很好,仔细检查了所有内容,一切都很好。

我知道你可以使用

$author = $auth->createRole('author');
$auth->add($author);
$auth->addChild($author, $createPost);

并且做得很好,但是,我想要自定义管理区域来设置角色、权限等,并最终添加组策略。

当我通过 gii 创建模型和 CRUD 来完成此操作时,每当我尝试添加 auth_item 时,我都会收到以下错误

    Integrity constraint violation – yii\db\IntegrityException

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`ronbuild`.`auth_item`, CONSTRAINT `auth_item_ibfk_1` FOREIGN KEY (`rule_name`) REFERENCES `auth_rule` (`name`) ON DELETE SET NULL ON UPDATE CASCADE)
The SQL being executed was: INSERT INTO `auth_item` (`name`, `type`, `description`, `rule_name`, `data`) VALUES ('dog', 1, '', '', '')
Error Info: Array
(
    [0] => 23000
    [1] => 1452
    [2] => Cannot add or update a child row: a foreign key constraint fails (`ronbuild`.`auth_item`, CONSTRAINT `auth_item_ibfk_1` FOREIGN KEY (`rule_name`) REFERENCES `auth_rule` (`name`) ON DELETE SET NULL ON UPDATE CASCADE)
)
↵
Caused by: PDOException

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`ronbuild`.`auth_item`, CONSTRAINT `auth_item_ibfk_1` FOREIGN KEY (`rule_name`) REFERENCES `auth_rule` (`name`) ON DELETE SET NULL ON UPDATE CASCADE)

in C:\wamp\www\ronbuild\vendor\yiisoft\yii2\db\Command.php at line 781

我试过更改列详细信息和其他几个位都无济于事,我想知道是否有人以前遇到过这个问题并找到了解决方案,因为我在上面找不到任何东西!

好吧,因为这折磨着我,而且不想被阻止,我开始从头开始为 AuthItem 构建一个单独的模型,来回反复之后,我怀疑了这一点。

public function rules()
{
    return [
        [['name', 'type'], 'required'],
        [['type', 'created_at', 'updated_at'], 'integer'],
        [['description', 'data'], 'string'],
        [['name', 'rule_name'], 'string', 'max' => 64]
    ];
}

Gii 生成的规则通过添加规则 [['name', 'rule_name'], 'string', 'max' => 64] 添加了对已连接外键的引用,正是规则中提到的 rule_name 将此错误带回给我一直。

真诚地希望这对任何搜索并找到它的人有所帮助,因为在任何地方都没有答案!!

我有同样的问题,但使用 batchInsert() 解决了这个问题。此方法将正确转义列名,并绑定要插入的值。

请查看参考资料http://www.yiiframework.com/doc-2.0/yii-db-migration.html#batchInsert()-detail

如何在以下迁移中使用 batchInsert() 方法的一个很好的例子:

https://github.com/wartron/yii2-account-rbac-uuid/blob/master/migrations/m150823_001311_create_default_roles.php

源代码可能如下所示:

public function up()
{
    $columns = ['name', 'type', 'description'];
    $this->batchInsert('{{%auth_item}}', $columns, [
        [
            'admin',
            1,
            'Role Admin',
        ],
        [
            'backend',
            1,
            'Role Backend',
        ],
        [
            'user',
            1,
            'Role User',
        ],
    ]);
}