【发布时间】:2019-01-31 07:28:17
【问题描述】:
Laravel 5.6 运行于: PHP 7.2, MariaDB 10.3
当我想为我的表设置外键时,我一直在犯这个错误。
在其他表上,所有由 Laravel 自己定义的 id 变量并自动递增无符号
所以,我的迁移是这样的:
public function up()
{
Schema::create('user_roles', function (Blueprint $table) {
$table->increments('id');
$table->unsignedInteger('role_id');
$table->unsignedInteger('user_id');
$table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});
}
错误是这样的:
SQLSTATE[42000]: 语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,了解在 lin 的 ') on delete cascade' 附近使用的正确语法 e 1 (SQL: alter table
user_rolesadd constraintuser_roles_role_id_foreignforeign key (role_id) referencesroles() on delete cascade)
Laravel 抛出的错误:
1 PDOException::("SQLSTATE[42000]: 语法错误或访问冲突:1064 您的 SQL 语法有错误;请查看与您的 MariaDB 服务器版本相对应的手册,了解在 ') 附近使用的正确语法删除第 1 行的级联") C:\xampp\htdocs\order-project\vendor\laravel\framework\src\Illuminate\Database\Connection.php:452
2 PDO::prepare("修改表
user_roles添加约束user_roles_role_id_foreign外键(role_id)在删除级联时引用roles()") C:\xampp\htdocs\order-project\vendor\laravel\framework\src\Illuminate\Database\Connection.php:452
【问题讨论】:
-
其他表/迁移可以正常运行吗?所以设置没有问题?
-
试试:
$table->Integer('role_id')->unsigned() -
似乎 Laravel 出于某种原因忽略了
->references('id')。没有级联,它可以工作吗? -
@utdev 是的,所有其他迁移都运行没有任何错误。 @AlvaroAlves,我已经尝试过了,它给出了类似“ PDOException::("SQLSTATE[HY000]: General error: 1005 Can't create table
order-project.#sql-3228_8a(errno: 150 "Foreign key constraint is格式不正确“)”)“@Phiter不,它也不起作用。顺便说一句,Php Storm 说“在 Illuminate\Support\Fluent 中找不到方法'引用'”,但我认为这是关于 IDE 而不是关于 laravel,因为当我使用 VSC 时没有这样的错误。跨度> -
您可以在stackoverflow.com/questions/31263637/… 之后进行测试,这会将您的迁移查询作为原始 sql 查询返回。只是为了确保查询是正确的