• Если в БД есть запись "строка" - вставить запись "строка-1", если есть "строка-1" - вставить "строка-2"?

    @Stress-str Автор вопроса

    Александр Лыкасов @lykasov-aleksandr
    Периодически использую в Yii расширение Zelenin\yii\behaviors\Slug для генерации slug, но никогда не заглядывал "под капот" как оно там работает. Сейчас заглянул - автор в цикле добавляет к сгенерированному slug число и проверяет нет ли такой записи в таблице.


    Исходя из комментария, остановился на следующем решении:
    $tagName = 'Кот';
    /* из $tagName создаём $slug */
    $slug = 'kot';
    
    $sql = 'SELECT `slug` FROM `tags` WHERE `slug` LIKE :slug';
    $params = ['slug' => $slug . '%'];
    $stmt = $db->prepare($sql);
    
    if ($stmt->execute($params)) {
        $total_row = $stmt->rowCount();
        if ($total_row > 0) {
            $result = $stmt->fetchAll();
            foreach ($result as $row) {
                $data[] = $row['slug'];
            }
            if (in_array($slug, $data)) {
                $count = 0;
                while (in_array( ($slug . '-' . ++$count), $data) );
                $slug = $slug . '-' . $count;
            }
        }
    }
    $sql = 'INSERT INTO `tags` (`name`, `slug`) VALUES (:tagName, :tagSlug)';
    $params = ['tagName' => $tagName, 'tagSlug' => $slug];
    $stmt = $db->prepare($sql);
    $stmt->execute($params);
    
    echo $slug;
  • Если в БД есть запись "строка" - вставить запись "строка-1", если есть "строка-1" - вставить "строка-2"?

    @Stress-str Автор вопроса
    Это да. Нужно немного другое.
    В таблице 3 колонки:
    Id, name, slug
    Все поля уникальны
    В колонке slug могут быть только безопасные символы: буквы, цифры и тире
    В колонке name могут быть любые символы
    Если в name записывается "Кот", то для slug это будет "kot"
    А если name будет "Кот!", то slug будет опять "kot"
    И вот этих разных, но одинаковых котов и хотелось бы записать в базу как разных, не добавляя к хвосту timestamp или подобное.
    А просто kot, kot-1, kot-2 итд. Если.
    Понятна идея? Или я путанно объясняю?
  • Если в БД есть запись "строка" - вставить запись "строка-1", если есть "строка-1" - вставить "строка-2"?

    @Stress-str Автор вопроса
    Slava Rozhnev, в бд есть 2 колонки id и name
    1 | кот
    2 | пёс
    3 | снеговик

    если в таблицу вставляется слово, которого в таблице нет, - оно так и вставляется:
    4 | новое слово
    а если в таблицу вставляется "кот" ещё раз, - то хотелось бы, чтобы кот вставился как "кот-2"
    5 | кот-2

    А если этих котов 500? каждый раз в цикле дёргать бд, чтобы вставить 501-го кота?