首页 > 解决方案 > updateOrCreate 向 laravel 8 中名为“id”的属性和原始数组添加一列

问题描述

喜欢表迁移代码


$table->primary(['user_id', 'post_id']);
            $table->foreignId('user_id');
            $table->foreignId('post_id');
            $table->boolean('liked');
            $table->timestamps();

            $table->foreign('user_id')
                ->references('id')
                ->on('users')
                ->onDelete('cascade');

            $table->foreign('post_id')
                ->references('id')
                ->on('posts')
                ->onDelete('cascade');

            $table->unique(['user_id', 'post_id']);

喜欢后雄辩的关系

public function likes()
    {
        return $this->hasMany(Like::class);
       
    }

像功能码

public function like($user = null, $liked = true)
    {
        $this->likes()->updateOrCreate(
            [
                'user_id' => $user ? $user->id : auth()->id(),
            ],
            [
                'liked' => $liked
            ]
        );

    }

当我 var_dump updateOrCreate 我得到:

App\Models\Like {#1248 ▼
  #guarded: []
  #connection: "mysql"
  #table: "likes"
  #primaryKey: "id"
  #keyType: "int"
  +incrementing: true
  #with: []
  #withCount: []
  +preventsLazyLoading: false
  #perPage: 15
  +exists: true
  +wasRecentlyCreated: true
  #attributes: array:6 [▼
    "user_id" => 1
    "post_id" => 11
    "liked" => true
    "updated_at" => "2021-07-17 00:16:15"
    "created_at" => "2021-07-17 00:16:15"
    "id" => 0
  ]
  #original: array:6 [▼
    "user_id" => 1
    "post_id" => 11
    "liked" => true
    "updated_at" => "2021-07-17 00:16:15"
    "created_at" => "2021-07-17 00:16:15"
    "id" => 0
  ]
  #changes: []
  #casts: []
  #classCastCache: []
  #dates: []
  #dateFormat: null
  #appends: []
  #dispatchesEvents: []
  #observables: []
  #relations: []
  #touches: []
  +timestamps: true
  #hidden: []
  #visible: []
  #fillable: []
}

如您所见,有一个 id 元素,我不知道它来自哪里。

注意。

SQLSTATE [42S22]:未找到列:1054 'where 子句'中的未知列 'id'(SQL:更新likesliked= 1 likes,. updated_at= 2021-07-17 00:20:29 where idis null)

编辑:

标签: phplaravellaravel-8

解决方案


那将是like正在创建的实际模型的 ID。user虽然你在和之间有关系postlike正在创建的模型仍然需要它自己的id用于在 eloquent 中引用。如主键文档中所述。

Eloquent 还会假设每个模型对应的数据库表都有一个名为 id 的主键列。

将 id 列添加到您的 like 表将解决问题,这可以通过id在迁移中使用 * 方法来完成。

Schema::create('likes', function (Blueprint $table) {
    $table->id();
});

推荐阅读