Laravel errors太误导ether了debug模式,有什么方法可以更清楚的errors吗?

Laravel errors is too misleading ether with debug mode, is there any ways to have more clear errors?

我在迁移中有一个拼写错误:

    Schema::create('business_category',function(Blueprint $table){
        $table->integer('business_id')->unsinged();
        $table->integer('category_id')->unsinged();
    });
    Schema::create('business_category',function(Blueprint $table){
        $table->foreign('business_id')->references('id')->on('business');
        $table->foreign('category_id')->references('id')->on('category');
    });

我运行"php artisan migrate" 已显示此错误:

[Illuminate\Database\QueryException]
SQLSTATE[HY000]: General error: 1005 Can't create table 'brandecide.#sql-42 4_aa' (errno: 150) (SQL: alter table business_category add constraint bus
iness_category_business_id_foreign foreign key (business_id) references business (id))

此错误由以下原因引起:

        $table->integer('business_id')->**unsinged**();

我应该将其更改为

        $table->integer('business_id')->**unsigned**();

修复它。 我应该如何从错误中理解这一点?

您的 business_category table 中可能已经有一些条目。当 运行 迁移时,您正在尝试添加一个引用另一个 table 的列。由于您没有定义任何默认值,MySQL 尝试将该值默认为 null,但这与另一个 table 中的任何内容都不对应。当有外键时,该列 中的值必须 对应于另一个 table.

中的值

所以要解决它,您可以创建一个 ->default(1),假设 ID 1 存在于您的 business-table.

How should I understand this from the error?

很遗憾,你不能。我同意该错误具有误导性。问题是 unique() 不是真正的方法。 (如果是这样你会得到一个方法未定义的异常)

相反,对 unique() 的调用最终被 Illuminate\Support\Fluent

捕获
public function __call($method, $parameters)
{
    $this->attributes[$method] = count($parameters) > 0 ? $parameters[0] : true;
    return $this;
}

然后在不进行任何检查的情况下添加到 $this->attributes。这不会导致错误,只会导致永远不会使用的属性 (unsinged) 和导致约束失败的缺失 unsigned

如果需要,可以在 github 上 create an issue(类型 "proposal")。也许有人知道如何防止这种情况发生。 (例如,公认方法的白名单)