使用 Laravel 5.4.13,我有一个名为 Widget 的模型,我在其中设置主键如下:
protected $primaryKey = 'widget_id';
小部件表有一个主键列 int,自动递增,命名为:widget_id。
但是,当我尝试在浏览器上更新记录时,出现此错误:
连接中的查询异常.php第 647 行:
SQLSTATE[42S22]:找不到列:1054 "where 子句"中的未知列"id"(SQL:从name
= est eum 和id
<> 3 中选择 count(*) 作为聚合widgets
)
它仍然查找名为:id 而不是 widget_id 的列。
我发现它发生在此验证中:
$this->validate($request, [
'name' => 'required|string|max:40|unique:widgets,name,' .$widget->widget_id
]);
我错过了什么?
这可能是一个封闭的问题,但我遇到了同样的问题,我希望根据我为解决问题而采取的新方法做出贡献:
Laravel允许您使用以下方法指定要在关系模型中使用的外键:
返回 $this->hasOne('App\Model_name','foreign_key');
完成此操作后,您可以扩展模型并拉回关联的记录,而无需指定唯一字段。
要查看有关此内容的更多信息,请遵循文档。
试试这个:
$this->validate($request, [
'name' => 'required|string|max:40|unique:widgets,name,' .$widget->widget_id.',widget_id'
]);
您实际上是如何添加这个新widget_id
的?你对id
领域做了什么?如果我理解得很好,您想删除id
并将其替换为widget_id
对吗?
请记住,您不能在同一个表中有两个自动增量字段,等等,如果您想正常工作,您希望widget_id
成为AI。(您可以在模型中使用public $incrementing = false;
,但我不建议这样做)
我建议删除id
并通过新的迁移添加widget_id
。要创建迁移,请使用工匠命令:
php artisan make:migration alter_user
然后添加
public function up()
{
Schema::table(User::TABLE, function(Blueprint $table)
{
$table->dropColumn('id');
});
Schema::table(User::TABLE, function(Blueprint $table)
{
$table->increments('widget_id');
});
}
public function down()
{
Schema::table(User::TABLE, function(Blueprint $table)
{
$table->dropColumn('widget_id');
});
Schema::table(User::TABLE, function(Blueprint $table)
{
$table->increments('id');
});
}
注意:不能将它们添加到同一架构中。
然后,将protected $primaryKey = 'widget_id';
添加到模型中。确保扩展IlluminateDatabaseEloquentModel
。
它为我提供了一个全新的 laravel 5.4 安装,对用户表进行了修改。希望对您有所帮助。
我在 Laravel 5.4 中遇到了同样的问题,实际上是
protected $primaryKey = 'widget_id';
似乎不再起作用了。 因此,我为解决问题所做的是使用特定的自定义私钥和外键重写所有模型。 例如,在此处阅读有关外密钥和本地密钥的一对一模型的文档:https://laravel.com/docs/5.4/eloquent-relationships#one-to-one
基本上,您必须在模型上手动定义外键和本地键。 因此,如果我们有一个具有一对一关系的 Widget 和 User 表,请按如下方式更改模型: 在"用户"表中
return $this->hasOne('AppWidget', 'foreign_key_of_widget_table')
在小部件模型中:
return $this->hasOne('AppUser', 'foreign_key_of_users_table', 'local_key_of_widgets_table');
我不得不重写我项目中的所有内容。 希望这有帮助。