自定义主密钥不起作用 拉拉维尔 5.4.



使用 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');

我不得不重写我项目中的所有内容。 希望这有帮助。

最新更新