我正在使用CakePHP 2.4,我需要一个名为Files的模型来存储用户,案例和卡车的文件信息。现在,文件可以与许多其他模型(用户,案例,卡车等)相关联。换句话说,我希望用户拥有文件,拥有文件的案例和拥有文件的卡车。
我是否需要创建UserFiles模型,CaseFiles模型和TruckFiles,或者我是否可以在Files中标记它是用户记录,案例记录还是卡车记录?我也想对Notes和Tasks做同样的事情,所以会有UserNotes,CaseNotes和TruckNotes,或者我可以有Notes(id,foreign_id,associatedModel(将是Truck,User或Case)等)。因此,当我创建用户时,我的文件与我的User.id相关联,并且条件是associatedModel是User。
我想我需要创建UserFiles,UserNotes和UserTasks。但如果有一个好的设计和更好的方法,我愿意接受建议。
答案 0 :(得分:1)
CakePHP已经有一个名为File的类。请参阅:http://api.cakephp.org/2.4/class-File.html
为此,最好使用其他名称,例如Attach。
User hasMany Attach
Case hasMany Attach
Truck hasMany Attach
而不是在'attaches'表上创建三个外键(如user_id,case_id和truck_id),在这种情况下,我更喜欢将model_name和model_id字段创建为外键。
架构表附件:
- id
- model_name
- model_id
- ...
模型附件:
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'),
),
);
模型用户,案例,卡车:
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
),
);
答案 1 :(得分:0)
您需要创建这些模型
然后,根据需要定义model associations。
例如:User hasMany File,Case hasMany File,Truck hasMany File,File belongsTo User,Case and Truck
答案 2 :(得分:0)
考虑它的一种方法是,关系是一对多(hasMany),多对一(belongsTo),一对一(hasOne),还是多对多(hasAndBelongsToMany)。使用前面提到的三个,您可以将外键存储在其中一个模型中,因为至少有一个关联的模型只与另一个表中的一个条目相关联。在多对多关系中,您需要一个连接表来存储表示关联的外键对。
在这种情况下,如果您正在谈论的文件可以属于许多用户,并且用户可以拥有多个文件,那么这是多对多或hasAndBelongsToMany关系,然后是,您需要一个UsersFile连接表。但是,如果一个文件只能属于一个用户,或者一个用户只能有一个文件,那么你就是在谈论其他一个关系,而你不需要连接表。文件/案例和文件/卡车也是如此。