CakePHP прозрачное сохранение уникальных данных - PullRequest
0 голосов
/ 06 июня 2011

У меня есть модели Person и Phone / Email с отношениями HABTM.После некоторой боли я узнал, что моя жизнь стала проще, когда я разбил HABTM на: Person hasMany PeoplePhone, Phone hasMany PeoplePhone, PeoplePhone принадлежит To (Person, Phone).Что ж, мне не нужна помощь с этим :-) Теперь моя проблема в другом:

Прежде чем я смогу связать Персона с его телефоном или электронной почтой, мне нужно сохранить этот телефон / электронную почту и затем получитьИд.новичок в CakePHP.Как CakePHP-гуру решит эту функцию / метод?

Большое спасибо за ваше время.

-Petr

Ответы [ 2 ]

1 голос
/ 06 июня 2011

На вашем месте я бы придерживался функциональности Cake по умолчанию, а не того, что вы делаете.Все эти функции встроены в Cake, так зачем изобретать велосипед?

Во-первых, отношения HABTM уже работают, когда вы их разорвали.Вы можете получить доступ к моделям объединения, добавив с в ассоциации моделей.Это должно дать вам доступ к данным таблицы пересечений.

$hasAndBelongsToMany =  array(
    'Phone' => array(
        'className'              => 'Phone',
        'joinTable'              => 'persons_phones',
        'foreignKey'             => 'person_id',
        'associationForeignKey'  => 'phone_id',
        'unique'                 => false,
        'with'           => 'PersonsPhones'
    )
);

Что касается ваших уникальных требований к телефону и электронной почте, почему бы не использовать встроенную проверку Cake для проверки?Таким образом, вы просто вызываете функцию сохранения, а затем Cake выполнит всю проверку за вас.

Например, если у человека есть только один адрес электронной почты, то сделайте это в модели человека.Это подтвердит, что ввод является адресом электронной почты и что это уникальный адрес электронной почты в базе данных.Вы можете выполнить эту проверку с любым полем и с легкостью создавать собственные правила проверки.

public $validate = array(
    'email' => array(
        'email' => array(
            'rule' => 'email',
            'message' => 'You must enter an email address.'
        ),
        'isUnique' => array(
            'rule' => 'isUnique',
            'message' => 'An account with this email address already exists.'
        )
    )
);

Насколько я понимаю, есть причина, по которой вы бы использовали HABTM для адреса электронной почты.Обычно люди не делятся адресами электронной почты, поэтому hasMany, вероятно, будет лучше.Я вижу, как это работает для телефона, потому что люди часто делятся телефонными номерами.Я говорю это так, чтобы вы были уверены, что HABTM - это отношения, которые вы действительно хотите использовать.

0 голосов
/ 06 июня 2011

Я использую CakePHP только пару месяцев, но реализовал бы его немного по-другому.

Я бы добавил уникальный индекс на person_id & email_id в моей таблице PeopleEmail (сделайте то же самое в PeoplePhone). Таким образом, мы не случайно сохраняем дублирующиеся данные, наша физическая схема предотвращает дублирование записей еще до их сохранения.

Теперь нам просто нужно следить за тем, как выдается ошибка SQL. Я еще не углубился в этот аспект Cake, но знаю, что базовый класс AppModel имеет метод onError (), который может быть полезен в этом отношении.

...