Codeigniter 4 - 如何正确使用实体

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

我没有太多使用实体,我不确定我是否使用正确。 我正在尝试将最喜欢的度假村添加到表格中。 这是我的代码:

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;

关系如下;

enter image description here 谢谢您的指点。

php codeigniter entity
1个回答
0
投票

天哪! 这是 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();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.