【问题标题】:custom primaryKey not working laravel 5.4自定义primaryKey不起作用laravel 5.4
【发布时间】:2017-07-20 17:21:09
【问题描述】:

使用 Laravel 5.4.13,我有一个名为 Widget 的模型,我在其中设置了这样的主键:

protected $primaryKey = 'widget_id';

widgets表有一个主键列,int,自增,命名为:widget_id。

然而,当我尝试在浏览器上更新记录时,我收到了这个错误:

Connection.php 第 647 行中的 QueryException:

SQLSTATE[42S22]:未找到列:1054 'where 子句'中的未知列'id'(SQL:从widgets 中选择计数(*)作为聚合,其中name = est eum 和id 3)

它仍然会查找名为:id 而不是 widget_id 的列。

我发现它发生在此验证中:

$this->validate($request, [
        'name' => 'required|string|max:40|unique:widgets,name,' .$widget->widget_id
    ]);

我错过了什么?

【问题讨论】:

    标签: laravel primary-key


    【解决方案1】:

    这可能是一个已解决的问题,但我遇到了同样的问题,我希望根据我为解决该问题而采取的新方法做出贡献:

    Laravel 允许你指定要在关系模型中使用的外键:

    return $this->hasOne('App\Model_name','foreign_key');

    完成后,您可以扩展模型并拉回关联的记录,而无需指定唯一字段。

    查看更多关于这个follow documentation的信息。

    【讨论】:

      【解决方案2】:

      试试这个:

      $this->validate($request, [
          'name' => 'required|string|max:40|unique:widgets,name,' .$widget->widget_id.',widget_id'
      ]);
      

      【讨论】:

      • 感谢 dparoli,但这没有帮助。
      【解决方案3】:

      您是如何实际添加这个新的widget_id 的?你对id 字段做了什么?如果我理解你想删除id 并用widget_id 替换它对吗?

      请记住,同一个表中不能有两个自动增量字段,等等,如果你想正常工作,你希望widget_id 是 AI。 (您可以在模型中使用public $incrementing = false;,但我不建议这样做)

      我建议删除 id 并在新迁移中添加 widget_id。要创建迁移,请使用 artisan 命令:

      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'; 添加到模型中。确保扩展Illuminate\Database\Eloquent\Model

      它适用于我全新的 laravel 5.4 安装,在用户表上进行修改。希望对你有帮助。

      【讨论】:

      • 谢谢,但我不是在谈论用户表。我使用widget_id 字段而不是id 字段的迁移创建了表(小部件)。它是表中唯一的 AI 字段。此表中没有id列只有widget_id。
      • 这里是迁移代码: Schema::create('widgets', function (Blueprint $table) { $table->increments('widget_id'); $table->integer('user_id' )->unsigned(); $table->string('name')->unique(); $table->string('slug')->unique(); $table->timestamps(); });
      【解决方案4】:

      我在使用 Laravel 5.4 时遇到了同样的问题,实际上是

      protected $primaryKey = 'widget_id';
      

      似乎不再工作了。 所以我为解决这个问题所做的就是用特定的自定义私钥和外键重写所有模型。 例如,在此处阅读有关外键和本地键的一对一模型的文档:https://laravel.com/docs/5.4/eloquent-relationships#one-to-one

      基本上,您必须在模型上手动定义外键和本地键。 所以如果我们有一个 Widget 和 User 表是一对一的关系,那么改变模型如下: 在用户表中

      return $this->hasOne('App\Widget', 'foreign_key_of_widget_table')
      

      在小部件模型中:

      return $this->hasOne('App\User', 'foreign_key_of_users_table', 'local_key_of_widgets_table');
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-21
        • 2020-07-22
        • 1970-01-01
        • 2017-11-09
        • 2015-02-07
        • 2017-06-27
        • 2017-12-13
        • 2017-12-04
        相关资源
        最近更新 更多