我没有太多使用实体,我不确定我是否使用正确。 我正在尝试将最喜欢的度假村添加到表格中。 这是我的代码:
function myFavorite() {
$resortID = $this->request->getVar('resortID');
$user_id = $this->current_user->id;
if ($resortID && $user_id) {
// Load the model
$SknowedWeatherFavoritesModel = new \App\Models\SknowedWeatherFavoritesModel();
// Create a new entity
$SknowedWeatherFavoritesEntity = new \App\Entities\SknowedWeatherFavoritesEntity();
$SknowedWeatherFavoritesEntity->sknowedWeather_id = $resortID;
$SknowedWeatherFavoritesEntity->user_id = $user_id;
// Save the entity
if ($SknowedWeatherFavoritesModel->save($SknowedWeatherFavoritesEntity)) {
return "Favorite added successfully.";
die();
} else {
return "Failed to add favorite.";
die();
}
} else {
return "Missing resortID or user_id.";
die();
}
}
以上有效。 如果我点击度假村上的“我最喜欢的”按钮,它会添加例如,id(自动公司),resortID 和 user_id。
我面临的问题是,如果我再次点击 myFavorite 按钮,它会添加另一个相同的记录,除了自动增量增加 1。我正在阅读 ->save 将插入(如果是新的)和更新(如果已存在)。如何确保不重复输入? 还是我做错了?
这是我的数据库(删除了不相关的字段);
CREATE TABLE `sknowedWeatherFavorites` (
`sknowedWeatherFavorites_id` int NOT NULL,
`sknowedWeather_id` varchar(17) CHARACTER SET utf8mb3 COLLATE
utf8mb3_general_ci NOT NULL,
`user_id` int UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE `sknowedWeather` (
`id` varchar(17) NOT NULL,
`website` varchar(64) DEFAULT NULL,
`updated_at` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
CREATE TABLE `user` (
`id` int UNSIGNED NOT NULL,
`name` varchar(128) NOT NULL,
`updated_at` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
关系如下;
天哪! 这是 ChatGPT 的回复,对我有用:
您走在正确的道路上!但是,CodeIgniter 中的 save 方法不会自动防止重复条目。如果提供了主键或唯一标识符,它的工作方式是插入新行或更新现有行。在您的情况下,由于 sknowedWeather_id 和 user_id 一起定义了“收藏夹”,因此您可以在数据库级别强制执行唯一性并在代码中处理它。
以下是确保没有重复条目的方法:
1。在数据库中添加唯一约束
修改 sknowedWeatherFavorites 表以防止同一 user_id 和 sknowedWeather_id 组合出现重复条目:
ALTER TABLE `sknowedWeatherFavorites`
ADD UNIQUE KEY `unique_favorite` (`user_id`, `sknowedWeather_id`);
这将确保任何插入重复记录的尝试都会失败。
2。保存前检查现有记录
您可以添加逻辑来检查 user_id 和 sknowedWeather_id 的组合是否已经存在:
function myFavorite()
{
$resortID = $this->request->getVar('resortID');
$user_id = $this->current_user->id;
if ($resortID && $user_id) {
// Load the model
$SknowedWeatherFavoritesModel = new \App\Models\SknowedWeatherFavoritesModel();
// Check if the favorite already exists
$exists = $SknowedWeatherFavoritesModel->where('user_id', $user_id)
->where('sknowedWeather_id', $resortID)
->first();
if ($exists) {
return "This resort is already in your favorites.";
}
// Create a new entity
$SknowedWeatherFavoritesEntity = new \App\Entities\SknowedWeatherFavoritesEntity();
$SknowedWeatherFavoritesEntity->sknowedWeather_id = $resortID;
$SknowedWeatherFavoritesEntity->user_id = $user_id;
// Save the entity
if ($SknowedWeatherFavoritesModel->save($SknowedWeatherFavoritesEntity)) {
return "Favorite added successfully.";
} else {
return "Failed to add favorite.";
}
} else {
return "Missing resortID or user_id.";
}
}
3.优雅地处理重复项
如果你使用数据库约束,你可以优雅地处理异常:
try {
$SknowedWeatherFavoritesModel->save([
'sknowedWeather_id' => $resortID,
'user_id' => $user_id,
]);
return "Favorite added successfully.";
} catch (\Exception $e) {
if ($e->getCode() == 1062) { // Duplicate entry error code
return "This resort is already in your favorites.";
} else {
return "Failed to add favorite: " . $e->getMessage();
}
}