簡體   English   中英

如何使用 Eloquent 刪除具有復合主鍵的記錄?

[英]How to delete record with composite primary keys using Eloquent?

我正在嘗試使用 Eloquent - Laravel 刪除具有兩個主鍵的記錄。

這是我的 model

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

Controller

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 文檔所說:

Eloquent 要求每個 model 至少有一個可以作為其主鍵的唯一標識“ID”。 Eloquent 型號不支持“復合”主鍵。 但是,除了表的唯一標識主鍵之外,您還可以自由地向數據庫表添加額外的多列唯一索引。

所以不能用eloquent的一些方法。

但是看到你的代碼,看起來你正在嘗試為關系 pivot 表創建一個 model (用戶和crd之間的多對多(什么是 crd?。沒有理由在這里縮寫。)

嘗試在您的用戶和 crd model 上定義多對多關系。

laravel 鍵列的命名約定是: model_name_id為 model 命名的ModelName

但是,只是為了刪除,您可以跳過查詢中的first

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

發生這種情況是因為當您刪除 model(您的嘗試)時,laravel 使用主鍵字段(默認為 id)作為 where 條件。 但是手動查詢,你定義的是刪除的where子句。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM