2013-09-23 3 views
1

У меня есть модель пользователя, которая используется для хранения данных о пользователях системы стоматологического обследования.Cakephp - несколько моделей для одной таблицы

Как правило, будут существовать три типа пользователей: Admininistrator, Расположение Менеджер и Examiner.

Кажется, что необходимо рассматривать эти три роли как отдельные модели в моем приложении (представьте, как у меня будет другое представление для каждой роли с разными параметрами и т. Д.) Это кошмар).

Как мне настроить отношения в каждой модели.

Моя первая мысль:

//Administrator Model 
class Administrator extends User { 
    $name = 'Administrator'; 
    $table = 'User'; 
    $belongsTo = array(
     'User' => array(
      'className' => 'User', 
      'conditions' => array('User.role' => 'administrator'), 
     ) 
    ); 
} 

И тогда модель User будет ссылаться на этот используя hasMany? В терминах конвенции CakePHP, как бы на самом деле точно это моделировать?

Кроме того, будет ли эта модель расширять модель User или AppModel?

+0

ПОЧЕМУ ?! Не можете ли вы просто добавить одну «опцию» с соответствующими данными для каждого пользователя на основе роли? – yossi

+0

Я согласен с тем, что наличие совершенно разных моделей для каждого типа пользователя может быть не лучшим дизайном. Но я не знаю достаточно подробностей, чтобы знать наверняка. Что касается ваших вопросов - у модели пользователя должен быть только один администратор, менеджер местоположений или экзаменатор, поэтому hasOne должен быть отношениями. Скорее всего, вы просто захотите, чтобы другие модели, администратор и т. Д. Расширили AppModel, а не User. – Kai

ответ

2

Конечно, вы можете создавать разные модели, используя одно и то же имя таблицы. Чтобы сделать это, связать каждую модель с определенной таблицей со свойством $ useTable (не $ таблицы):

class Administrator extends AppModel { 
    public $useTable = 'User'; 
} 

Но я не знаю ни одной модели собственности CakePHP, которая позволит фильтровать данные, возвращаемые при обработке результатов .. . Вы можете только писать свои собственные условия, при компоновке модели с другой, например:

class SomeOtherModel extends AppModel { 
    public $hasMany = array(
     'Administrator' => array(
      'className' => 'Administrator', 
      'conditions' => array('Administrator.role' => 'administrator') 
     ) 
    ); 
} 

который не является хорошим решением, потому что она будет работать только при выполнении запросов для модели SomeOtherModel.

Вы также можете попробовать применить обратный вызов afterFind() к вашим моделям Administrator/Examiner/..., который удалит пользователей другой роли, чем необходимо, но, конечно, это не эффективное решение.

Другое решение - это просто создание разных представлений базы данных, которые будут содержать только пользователей выбранной роли (больше на представлениях - here). Затем вы можете указать каждое представление на вашу модель CakePHP, так же, как это была обычная таблица базы данных. Но это решение также не идеально. Если вам нужно будет добавить новую роль пользователя или изменить схему таблицы в будущем, вам также придется изменить свои представления в базе данных.

Смежные вопросы