У меня есть модель User, которая используется для хранения данных о пользователях системы стоматологического обследования.
Как правило, существуют три типа пользователей: администратор , диспетчер местоположений и эксперт .
Кажется, возникла необходимость рассматривать эти три роли как отдельные модели в моем приложении (представьте, как у меня будет другое представление для каждой роли с разными параметрами и т. Д.) Это кошмар.
Как мне настроить отношения в каждой модели.
Моя первая мысль:
//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?
Конечно, вы можете создавать разные модели, используя одно и то же имя таблицы. Для этого свяжите каждую модель с определенной таблицей с использованием свойства $ useTable (а не $ table):
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 / …, которые будут удалять пользователей другой роли, чем необходимо, но, конечно, это не эффективное решение.
Другое решение – это просто создание разных представлений базы данных, в которых будут присутствовать только пользователи выбранной роли (подробнее о представлениях – здесь ). Затем вы можете указать каждое представление на вашу модель CakePHP, так же, как это была обычная таблица базы данных. Но это решение также не идеально. Если вам нужно будет добавить новую роль пользователя или изменить схему таблицы в будущем, вам также придется изменить свои представления в базе данных.