如何使用 Eloquent 删除复合主键的记录?

问题描述 投票:0回答:3

我正在尝试使用 Eloquent - Laravel 删除具有两个主键的记录。

这是我的模型

class Like extends Model
{
    //protected $primaryKey = ['crdid', 'usrid'];
    public $timestamps = false;
    use HasFactory;
}

控制器

try{
     $dellike = Like::where('crdid', '=', $like->crdid, 'and')
    ->where('usrid', '=', $like->usrid)->first();
                    $dellike->delete();
   }
   catch(Exception $e){
       return $e->getMessage();
   }

表格定义

Schema::create('likes', function (Blueprint $table) {
        $table->biginteger('crdid');
        $table->biginteger('usrid');
        $keys = array('crdid', 'usrid');
        $table->primary($keys);
    });

但是,它给了我以下错误;

 Column not found: 1054 Unknown column 'id' in 'where clause' (SQL: delete from `likes` where `id` is null)

我相信“id”是 Eloquent 使用的默认主键,但我没有使用它。

我应该如何定义,我没有使用默认主键?或者删除具有复合主键的记录的正确方法是什么?任何帮助将不胜感激。

laravel eloquent backend composite-key
3个回答
1
投票

正如 Laravel Eloquent Docs 所说:

Eloquent 要求每个模型至少有一个唯一标识“ID”作为其主键。 Eloquent 模型不支持“复合”主键。但是,除了表的唯一标识主键之外,您还可以向数据库表添加额外的多列唯一索引。

所以你不能使用一些雄辩的方法。

但是看到你的代码,看起来你正在尝试为关系数据透视表创建一个模型(用户和

crd
之间的多对多(什么是crd?!没有理由在这里缩写。)

尝试在您的用户和 crd 模型上定义多对多关系。

关键列的 laravel 命名约定是:

model_name_id
对于名为
ModelName

的模型

但是,如果要删除,您可以跳过查询中的

first

Like::where('crdid', '=', $like->crdid, 'and')
    ->where('usrid', '=', $like->usrid)->delete();

发生这种情况是因为当您删除模型(您的尝试)时,laravel 使用主键字段(默认为 id)作为 where 条件。但是手动查询,你正在定义删除的where子句。


0
投票

只需在表中创建名为 id 的附加列作为唯一的自动增量选项。 Eloquent 将使用它来删除具有删除功能的每一行。 Laravel 5.5 的示例:

$logement = Logement::findOrFail($id);
$commodites = Commodites_logement::all()->where('logement_id','=',$logement->id);
foreach ($commodites as $commodite) {
   $commodite->delete();
}

0
投票

如果其他人正在努力删除具有复合主键的行,这里有一个简单的方法(无论您的模型类定义如何)。

在此示例中,表 category 的键定义为

[catId, userId]

在我的JS文件中,请求是这样发出的:

axios.delete(`/category/${catId}/${userId}`)

为了简单起见,我使用 axios,但你可以使用 fetch API、jQuery、Alpine 或任何你喜欢的东西。

我的控制器文件中的方法:

   public function destroy($catId, $userId) {
      $result = $this->category->destroy($catId, $userId);
      return $result;
   }

我的模型类中的方法:

   /**
    * Marks the row, with the given key, as deleted.
    * 
    * @param int $catId  The category id.
    * @param int $userId  The user id.
    */
   public function destroy($catId, $userId) {
      $this->userId = $userId;
      $this->categoryId = $catId;
      $query = "UPDATE category SET deleted = 'Y' WHERE userId = ? AND categoryId = ?";
      return DB::delete($query, [$this->userId, $this->categoryId]);
   }

我的路线定义如下:

Route::delete('/category/{catId}/{userId}', [categoryController::class, 'destroy']);

模型类方法仅将行标记为已删除(我自己管理软删除,因为我不喜欢 Laravel 方式)。该代码实际上按预期工作。

我希望这个例子对任何人都有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.