我一直在尝试学习关联,特别是 hasMany,因为根据 cakephp 文档,这将最适合我的需求。
我有三张桌子
drugs
id | drug
5 | reality
records
id | user_id | a-couple-misc-fields
1 | 1 |
record_drugs
id | drug_id | record_id
1 | 5 | 1
我也有3个模型
//Drug.php
public $hasMany = array('RecordDrug');
//Record.php
public $hasMany = array('RecordDrug');
//RecordDrug.php
public $belongsTo = array('Record', 'Drug');
在我有这个之前,我只有一个表' records ',而不是' drug_id ',只是有' drug ',这将是'现实'。这种方法显然有效,但我知道这种方法从长远来看是行不通的。
我的旧查询
$records=$this->Record->find('list',
array('fields' => array('drug', 'sum'),
'group' => 'drug',
'conditions' => array('user_id' => $this->Auth->user('id'))));
如果我要运行这个完全相同的查询并使用“ drug_id ”而不是“ drug ”,我只会得到一个类似这样的数组:
'5' => '1' // The Drug => The Count of the Drug
但我需要它像这样显示:
'Reality' => '1'
我知道这个问题是否复杂需要帮助,但如果有人有任何资源或链接我可以查找这将帮助我解决这个问题,那将是惊人的!谷歌搜索只会向我展示如何设置连接模型,而不是如何实际使用它和检索数据。
编辑:
$this->loadModel('RecordDrug');
$this->RecordDrug->virtualFields['sum'] ='COUNT(*)';
$records=$this->RecordDrug->find('list',
array('fields' => array('drug_id', 'sum'),
'group' => 'drug_id'
));
$this->set('output',$records);
debug($records);
这主要给了我想要的东西;
array(
(int) 1 => '1',
(int) 2 => '2'
)
我现在唯一需要做的就是弄清楚如何将第一个值更改为与 id 关联的实际“药物”。
回答
因此,不要让我尝试将 drug_id 与实际药物相关联,这就是我让它正确显示的方式:
$this->RecordDrug->virtualFields['sum'] ='COUNT(*)';
$records=$this->RecordDrug->find('list',
array('fields' => array( 'Drug.drug', 'sum'),
'contain' => array('Drug', 'Record'), //Record is only here if you need the condition, you can remove record complete and the condition completely and it'll still work, but it'll give you ALL the results rather then just yours
'group' => 'Drug.Drug',
'conditions' => array('Record.user_id' => $this->Auth->user('id'))
));