我正在尝试使用 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 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子句。
只需在表中创建名为 id 的附加列作为唯一的自动增量选项。 Eloquent 将使用它来删除具有删除功能的每一行。 Laravel 5.5 的示例:
$logement = Logement::findOrFail($id);
$commodites = Commodites_logement::all()->where('logement_id','=',$logement->id);
foreach ($commodites as $commodite) {
$commodite->delete();
}
如果其他人正在努力删除具有复合主键的行,这里有一个简单的方法(无论您的模型类定义如何)。
在此示例中,表 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 方式)。该代码实际上按预期工作。
我希望这个例子对任何人都有帮助。