Какие методы обратного вызова cakephp выбрать? - PullRequest
0 голосов
/ 07 февраля 2011

У меня есть таблица user, в которой есть поля username, password и type.Тип может быть любым или комбинацией этих сотрудников, поставщиков и клиентов, то есть пользователь может быть как поставщиком, так и клиентом, или какой-либо другой комбинацией.Для поля типа я использовал несколько флажков, см. Код ниже.Это файл views / users / add.ctp

Form-> create ('User');?> Form-> input ('username');echo $ this-> Form-> input ('password');echo $ this-> Form-> input ('type', array ('type' => 'select', 'множественный' => 'флажок', 'options' => array ('client' => 'Client','vendor' => 'Vendor', 'employee' => 'Employee')));?> Form-> end (__ ('Submit', true));?>

Это код, который я использовал в файле модели.Метод обратного вызова beforeSave app / models / user.php

функция beforeSave () {if (! Empty ($ this-> data ['User'] ['type'])) {$ this-> data['User'] ['type'] = join (',', $ this-> data ['User'] ['type']);} вернуть истину;} Этот код сохраняет несколько значений как разделенные запятыми значения в дБ.

Основная проблема возникает, когда я редактирую пользователя.Если пользователь выбрал несколько типов во время создания пользователя, я не могу найти флажок для этого типа пользователя.

Ответы [ 3 ]

3 голосов
/ 07 февраля 2011

вы никогда не должны сохранять сериализованные данные, json или csv в поле. Это делает вашу жизнь очень тяжелой в дальнейшем.

Хотя habtm - это один из способов сделать что-то, если ваша двоичная математика разумна, вы можете проверить битовые маски для этого. вот отличный пост http://mark -story.com / posts / view / using-bitmasks-to-указать-статус

основы будут 1 = сотрудник 2 = продавец 4 = клиент // 8 = следующий_тип

тогда, если бы пользователь был тип employee & vendor, тип был бы 3 (1 + 2), а если бы это был vendor & client, тип был бы 6 (2 + 4)

Как вы можете видеть, нет никакого способа смешать это, и побитовая работа довольно хорошо работает в MySQL, так что находки довольно просты. Смотрите пост для более подробной информации

0 голосов
/ 07 февраля 2011

Если вы хотите изменить данные после того, как они были найдены в базе данных, вы можете использовать обратный вызов afterFind() в вашей модели.

Итак, в вашем случае укажите что-то вроде вашей пользовательской модели:

function afterFind($results) {
    $results['User']['type'] = explode(',', $results['User']['type']);
    return $results;
}

В руководстве CakePHP есть дополнительная информация о afterFind .

При этом, возможно, стоит рассмотреть другой подход, например, отношения HABTM, как впервые предложено deceze.выше.

0 голосов
/ 07 февраля 2011

У вас должна быть таблица types и таблица соединения users_types.
. Вы видите HABTM-отношение , поэтому вы должны обращаться с ним как с одним.В присоединяемой модели UsersType необходимо добавить пользовательское правило проверки , которое проверяет, разрешена ли текущая комбинация типов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...