Как не повторять реестры в Базе данных?

У меня есть таблица "налоги" с 2 колоннами (пойдите и имя). Я регистрирую имя, ej "инженер", тогда потом зарегистрировал "ИНЖЕНЕР" и равный я могу регистрировать ее. Как он мог бы предотвращать это?

Я не хотел бы, чтобы они сказали мне, что зарегистрировать все в прописных буквах в BD - идеальное, потому что я хотел, чтобы у пользователя была возможность выбрать, как он хочет зарегистрировать это; но предотвращая удвоение данных.

Я работаю с jQuery, Php, Laravel 5.3.

2
задан 07.11.2016, 20:29
4 ответа

Другие ответы могут решать проблему с базы данных, но они были бы почти неправильными внутри контекста использования framework, как Laravel в этом случае.

Laravel предлагает инструмент, который позволяет проверять информацию, полученную в формуляре, и делает гораздо более простую работу, не будучи должен использовать функции, свойственные механизму баз данных, ни быть должным играть ни с индексами ни синтаксисом:

Утверждения

В момент получения данных пользователя, обычно в Request (Laravel) или в драйвере, ты можешь санкционировать, что данные выполнили твои стандарты, в этом случае, что поле в специфическом средстве было единственным.

Лично я предпочитаю, чтобы утверждения были сделаны в Request и не в драйвере, производя вышеупомянутое утверждение посредством artisan и делая инъекцию ей как параметр ввода соответствующего метода в драйвер:

php artisan make:request StoreNameRequest

в драйвере

public function store(StoreNameRequest $request)
{
   //
}

Позже в файле StoreNameRequest.php, помещенном в namespace Requests, ты был бы должен использовать утверждение unique для твоего поля:

/**
 * Get the validation rules that apply to the request.
 *
 * @return array
 */
public function rules()
{
    return [
        'name' => 'required|unique:table,column'
    ];
}

Полная документация - в:

Утверждения в Laravel: https://laravel.com/docs/5.3/validation

Тип утверждения unique: https://laravel.com/docs/5.3/validation#rule-unique

Requests: https://laravel.com/docs/5.3/requests


Редактирование после разъяснения в комментариях:

Имея в виду, что оно ты не функционирует unique, правильная форма состояла бы в том, чтобы создавать утверждение, настроенное для вышеупомянутого поля, что-то как iunique, что не был "вступило в брак - sensitive" в момент реализации сравнения.

В любом случае и чтобы отвечать на твое другое сомнение, ты мог бы добавлять индекс с функцией lower() что вышли тебе на такую миграцию:

Schema::table('cargos', function(Blueprint $table){
    $sql = ' CREATE UNIQUE INDEX idx_lower_unique ON cargos (lower(nombre));';
    DB::connection()->getPdo()->exec($sql);
});
2
ответ дан 24.11.2019, 12:43
  • 1
    Попробуйте способа, в котором ты объясняешь, но равного изюма то, что я хочу предотвратить. То, что я хочу, состоит в том, чтобы я зарегистрировался " ingeniero" и в свою очередь не допускайтесь, что я зарегистрировал " INGENIERO". Я хочу запретить это. –  Pablo Contreras 07.11.2016, 16:56
  • 2
    Hab и # 237; в понятый зло, в любом случае это очень f и # 225; cil, просто ты можешь конвертировать стоимость в " совсем в min и # 250; sculas" или сходный, перед тем, как перемещать это validaci и # 243; n, в том же м и # 233; совсем rules(), если только ты не захочешь санкционировать это и зарегистрировать, tendr и # 237; хозяева, которые должны проверять, что база данных est и # 225; s используя, Постглинистый песчаник очень могущественный, чтобы делать сравнения этого типа. Уже у меня были сходные проблемы и я предпочел создавать мои м и # 233; все validaci и # 243; n в Laravel, для того, чтобы они санкционировали, не имея значение май и # 250; sculas или min и # 250; sculas. –  Shaz 07.11.2016, 17:00
  • 3
    я использую Постглинистый песчаник. Хуже до настоящего времени мне не приходит в голову что-то полностью оптимально: ( –  Pablo Contreras 07.11.2016, 20:09
  • 4
    М и # 225; s поздно тебя обновил soluci и # 243; n тогда, с которым ты нуждаешься, ты это har и # 233; знать с другим комментарием. –  Shaz 07.11.2016, 20:11
  • 5
    ok большое спасибо: D –  Pablo Contreras 07.11.2016, 20:14

Ты можешь добавлять индекс UNIQUE в колонну nombre таблицы cargos, с чем не смогут добавляться два равных налогов.

ALTER TABLE `cargos` ADD UNIQUE (nombre);

В случае пробования добавлять уже введенную стоимость, равную одному, mysql он возвратил бы такую ошибку как этот:

1062 - Удвойся entry 'В' for key 'имя'

4
ответ дан 24.11.2019, 12:43
  • 1
    я оцениваю ответ, но вот то, что я ищу. Unique не равен " ingeniero" в " INGENIERO" их считает отличными для поля эксперт и # 237; что регистрирует их. –  Pablo Contreras 07.11.2016, 16:39

Добавляя реестр UNIQUE это решение. Но ты имеешь общее, как конфигурировался "collation" твоего основания данных / таблиц / field. Чтобы это гарантировать, ты можешь делать следующее изменяя field таблицы и добавляя индекс:

    ALTER TABLE `cargos` MODIFY `nombre` VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_bin;
    ALTER TABLE `cargos` ADD UNIQUE (nombre);

Таким образом, mysql, он сравнит бинарной формы стоимость для этого поля. "collation", которые заканчиваются в _ci, - caseinsentive и те, которые заканчиваются в _cs или без _ci они casesensitive. Я надеюсь, что он подает тебя.

1
ответ дан 24.11.2019, 12:43
  • 1
    я использую postgresql:/ –  Pablo Contreras 07.11.2016, 20:15
  • 2
    В postgresql ты можешь пытаться со следующим способом: ВЕРЬТЕ В UNIQUE INDEX idx_lower_unique ON налоги (lower (имя)); –  Emiliano Torres 07.11.2016, 20:31
  • 3
    Спасибо. Я sirvi и # 243; правильно. Случайности ты знаешь, как делать это в laravel? Если cre и # 243; $table - и gt; index (и #39; имя и # 39;) он это не оставляет и #250; nico в таблице. Не q больше свойства размещать его, так как в documentaci и # 243; n laravel я не вижу, чтобы делать то же самое, что и он делает c и # 243; я говорю, что ты произошел со мной. –  Pablo Contreras 07.11.2016, 21:41
  • 4
    @PabloContreras я не манипулировал Laravel с postgresql. –  Emiliano Torres 07.11.2016, 22:30
  • 5
    ok спасибо. Уже, который может, и который я должен искать способ это добавлять с migrations. Спасибо bro. –  Pablo Contreras 07.11.2016, 23:31

Легкая форма могла бы состоять в том, чтобы создавать trigger, который делал бы проверку используя функции UCASE() или LCASE() внутри BBDD, и в случае, если уже он будет существовать, брось для назад изменения.

1
ответ дан 24.11.2019, 12:43