2015-02-18 3 views
1

Я работаю над моделями, использующими cakephp. У меня две модели, модель должности; который содержит отношения $ hasMany с моделью тегов. Я хочу, чтобы имя тега было уникальным. Это устраняет избыточность данных. Я хочу сделать его доступным для поиска через AJAX, например, в поле поиска для тегов. Мне нужно иметь возможность автоматически создавать теги «на лету», но только если они еще не созданы. Как достичь этого с помощью CakePHP 2.6.1?CakePHP: удаление избыточности в таблицах базы данных

Пример: Я создал две таблицы:

теги:

id name post_id 

сообщений:

id title url content 
+0

Какая версия CakePHP вы используете? – Oldskool

+1

Я использую CakePHP Version 2.6.1 –

ответ

2

Для того, чтобы убедиться, что значение любого тега name является уникальным, просто добавьте validation rule в модель Tag для поля имени. Существует определенное правило проверки isUnique. В файле app/Model/Tag.php, добавьте это:

public $validate = array(
    'name' => array(
     'rule' => 'isUnique', 
     'message' => 'This tag already exists.' 
    ) 
); 

Это приведет к любой операции сохранения на модели Tag с дублирующим именем тега сбой с сообщением об ошибке вы установили в модели.

Чтобы игнорировать любые дубликаты, немного измените способ сохранения вашего сохранения. Добавьте что-то подобное к вашей логике контроллера:

foreach ($this->request->data['Tags'] as $tagData) { 
    $this->Tag->set($tagData); 
    if ($this->Tag->validates()) { 
     $this->Tag->create(); 
     $this->Tag->save($tagData); 
    } 
} 
+0

Есть ли способ заставить его игнорировать уникальные поля? т.е. когда я запускаю $ this-> model-saveall (...), он все равно будет использовать уникальные значения, но он будет создавать только новые теги? –

+0

«Вы можете проверить, что набор полей уникален, предоставляя несколько полей и устанавливая $ или false» будет ли это делать? –

+0

@ DanielSamson Это работает немного иначе, но может быть сделано. См. Мой обновленный ответ. Вы можете проверить правила проверки каждого тега отдельно и выбрать только попытку 'save()', если он прошел, и ничего не делать. – Oldskool