cakephp模型与许多模型相关联

时间:2013-12-03 21:02:17

标签: cakephp database-design

我正在使用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。但如果有一个好的设计和更好的方法,我愿意接受建议。

3 个答案:

答案 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连接表。但是,如果一个文件只能属于一个用户,或者一个用户只能有一个文件,那么你就是在谈论其他一个关系,而你不需要连接表。文件/案例和文件/卡车也是如此。