就在几天前,我发现了这个名为CakePHP的奇迹,所以我对它很绿。 我需要构建一个邮件应用程序,所以我遵循了约定并创建了:
数据库描述:
用户表< user_id(主键),fname,lname&gt ;.
邮件表< mail_id(主键),从(外键到user_id)到(外键到user_id),内容,打开>。
我的问题:
1)根据惯例,外键应该被称为相关表+'_ id'。如果有两个与同一个表相关的外键,我应该如何调用列。喜欢来自和来自邮件表。
2)我想在两个表之间做一个内部JOIN。 类似的东西:
SELECT user_id, mail_id
FROM users
INNER JOIN mails
ON users.user_id =mails.to AND mails.opened=false.
但我不知道怎么做。
答案 0 :(得分:4)
当您需要对同一个表执行两个关系时,您需要覆盖默认约定。在你的例子中,我会制作2个外键。一个名为 sender_id ,另一个名为 recipient_id 。然后你会像他们一样加入模型:
<?php
class Mail extends AppModel {
//The Associations below have been created with all possible keys, those that are not needed can be removed
var $belongsTo = array(
'UserSender' => array(
'className' => 'User',
'foreignKey' => 'sender_id',
'conditions' => '',
'fields' => '',
'order' => ''
),
'UserRecipient' => array(
'className' => 'User',
'foreignKey' => 'recipient_id',
'conditions' => '',
'fields' => '',
'order' => ''
),
);
}
?>
然后为了满足你的条件,你会像这样引用它们:
<?php
$this->Mail->find(array('conditions'=>array('Mail.opened'=>false)));
?>
...并过滤发件人和收件人,您的条件如下:
<?php
$this->Mail->find(array('conditions'=>array('UserSender.some_field'=>$someValue,
'UserRecipient.some_field'=>$someValue)));
?>
答案 1 :(得分:1)
我自己不是专家,但在CakePHP网站上关注信息将进一步帮助您: Multiple-relations-to-the-same-model