您应该对所追求的关系非常谨慎。快速浏览其中的一些答案,它们似乎建议您仅将Email模型的联接添加到Person模型中,并依靠查找的条件来确保查询不会破坏服务器的内存。
我假设首先,您希望在Person的所有查询中都隐含此Email关系,否则您可以简单地在每个查询中 指定
联接。在这种情况下,您肯定要使用模型关系将其链接。
您的代码显示Shooting和ShootingPlacement(假定这是一个模型到模型的映射关系)都属于两个模型。顺便说一句,射击
belongsTo发射-
我们在这里还没有看到。我认为这不适用于当前情况。
现在,让我们假设一个坏处,因为您的电子邮件表 具有外键
,它将是一种
hasOne关系,而不是
hasMany-,因此您需要通过它进行链接。我将其链接到ShootingPlacement模型,因为这是您要查询的模型,因此它应该是围绕模型进行连接的中心点。在结构上明智,因为一切似乎都源于您的Person模型,所以我建议您改为查询
该 模型。但是到目前为止,它的设置方式将使您可以从几乎任何地方查询,并且仍然可以在几乎相同的结果栏中检索到一些模型名称和表别名。
纯粹是因为您在Email和ShootingPlacement之间的外键具有不同的名称,而CakePHP
1.3对此的处理不尽人意,因此我也建议您不要使用外键,而应将它作为 条件 放入关系中。
class ShootingPlacement extends AppModel{ var $name = 'ShootingPlacement'; var $actsAs = array('Containable'); var $hasOne = array( 'Email' => array( 'className' => 'Email', 'foreignKey' => false, 'conditions' => array( 'Email.shooting_placement_id = ShootingPlacement.id', 'Email.person_id = ShootingPlacement.person_id' ) ) ); var $belongsTo = array ( 'Person' => array ( 'className' => 'Person', 'foreignKey' => 'person_id', 'order' => 'lastname ASC' ), 'Shooting' => array ( 'className' => 'Shooting', 'foreignKey' => 'shooting_id' ) );}我还在那里添加了可包含的行为。这使您可以从每个查询中控制要与主要模型结果一起返回的关联模型。它默认为全部,但在只需要特定的内容和/或出于内存原因时会很方便(如果您不限制它们或仅指定想要的字段名称,这些类型的查询会很快破坏服务器的内存。返回)。
现在,当您创建电子邮件模型时,我不建议通过再次将其链接回ShootingPlacement来使这种纠结的模型进一步复杂化。就像您说的那样,它还具有Person模式的外键。因此,您可能希望对您的Person模型执行与上述完全相同的操作(当然,更改条件以反映Person外键)。这样,您的模型就更加灵活了。它仍将与ShootingPlacement
和 Person结合在一起,并且如果需要,还可以让您单独查询它,而无需其他关联模型。



