2013-12-03 3 views
0

Я использую CakePHP 2.4, и мне нужна модель под названием Files для хранения информации о файлах для пользователей, случаев и грузовиков. Теперь файл может быть связан со многими другими моделями (Пользователи, Случаи, Грузовики и т. Д.). Другими словами, я хочу, чтобы у пользователей были файлы, случаи, когда файлы и грузовики имели файлы.Модель cakephp, связанная со многими моделями

Нужно ли создавать модель UserFiles, модель CaseFiles и TruckFiles или я могу иметь запись в таблице, которая содержит флажки в файлах, которые являются записью пользователя, записью случая или записью грузовика? Я также хочу сделать то же самое для Notes и Tasks, так что будут либо UserNotes, CaseNotes, и TruckNotes, либо я могу получить Notes (id, foreign_id, relatedModel (будет Truck, User или Case) и т. Д.). Поэтому, когда я создаю своих Пользователей, у меня есть файлы, привязанные к моему User.id и имеющие условие, что связанныйМодель - это Пользователь.

Я думаю, мне нужно будет создать UserFiles, UserNotes и UserTasks. Но если есть хороший дизайн и лучший способ сделать это, я открыт для предложений.

ответ

1

CakePHP уже имеет класс с именем File. См.: http://api.cakephp.org/2.4/class-File.html

Для этого лучше использовать другое имя, например Attach.

User hasMany Attach 
Case hasMany Attach 
Truck hasMany Attach 

Вместо создания трех внешних ключей на столе "атташе (например, user_id, case_id и truck_id), в этом случае я предпочитаю создать MODEL_NAME и model_id поля как внешнего ключа.

схема таблицы присоединяет:

- id 
- model_name 
- model_id 
- ... 

модель Attach:

public $belongsTo = array(
    'User' => array(
     'className' => 'User', 
     'foreignKey' => 'model_id', 
     'conditions' => array('Attach.model_name' => 'User'), 
    ), 
    'Case' => array(
     'className' => 'Case', 
     'foreignKey' => 'model_id', 
     'conditions' => array('Attach.model_name' => 'Case'), 
    ), 
    'Truck' => array(
     'className' => 'Truck', 
     'foreignKey' => 'model_id', 
     'conditions' => array('Attach.model_name' => 'Truck'), 
    ), 
); 

модель пользователя, Case, Грузовик:

public $hasMany = array(
    'Attach' => array(
     'className' => 'Attach', 
     'foreignKey' => 'model_id', 
     'dependent' => true, 
     'conditions' => array('Attach.model_name' => 'User'), // Change the condition on Case and Truck model 
    ), 
); 
+0

совершенны, это то, что я думал, может быть сделано, но я не знал, будет ли это предпочтительным способом CakePHP. – JDubTech

0

Вы должны создать эти модели

  • Пользователь
  • Файл
  • Case
  • Грузовик

Затем вы определяете model associations, как вам нужно.

Например: Пользователь hasMany Файл Case hasMany Файл Грузовик hasMany Файл belongsTo файла пользователя, Case и грузовик

0

Один способ думать о нем, если отношения один ко многим (hasMany), многие один (принадлежит TO), один к одному (hasOne) или многие из многих (hasAndBelongsToMany). С учетом первых трех вы можете сохранить внешний ключ в одной из моделей, поскольку по крайней мере одна из связанных с ними моделей связана только с одной записью в другой таблице. В отношениях от многих до многих вам нужна таблица соединений для хранения пар внешних ключей, представляющих ассоциации.

В этом случае, если вы говорите о файле, который может принадлежать многим пользователям, и у пользователей может быть много файлов, то это отношение многих или многих или hasAndBelongsToMany, а затем да, вам нужно соединение UsersFile Таблица. Если, однако, файл может принадлежать только одному пользователю или у пользователя может быть только один файл, тогда вы говорите об одном из других отношений, и вам не нужна таблица соединений. То же самое можно сказать о файлах/случаях и файлах/грузовиках.

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