2013-04-29 31 views
2

我想查看连接的所有记录,并在连接的每一侧设置WHERE条件。CakePHP在每个表上查找条件相连的记录

例如,我有LOANBORROWER(加入borrower.id = loan.borrower_id)。我想要LOAN.field = 123和BORROWER.field = 'abc'的记录。

这里的答案(例如this one)似乎说我应该使用Containable。

我试过了。这里是我的代码:

$stuff = $this->Borrower->find('all', array(
    'conditions' => array(
     'Borrower.email LIKE' => $this->request->data['email'] // 'abc' 
    ), 
'contain'=>array(
    'Loan' => array(
     'conditions' => array('Loan.id' => $this->request->data['loanNumber']) // 123 
     ) 
    ) 
)); 

我预计将有一个结果,因为在我的数据,只有一个加盟纪录这两方面的条件。相反,我得到两个结果,

结果1 {Borrower: {field:abc, LOAN: {field: 123} } //正确

结果2 {Borrower: {field:abc, LOAN: {NULL} } //不正确

当我看着CakePHP中使用的SQL,我没有看到一个连接。我看到的是两个单独的查询:

查询1:SELECT * from BORROWER // (yielding 2 IDs)

查询2:SELECT * FROM LOAN WHERE borrower_id in (IDs)

这不是我想要的。我想加入表格,然后应用我的条件。我可以很容易地编写SQL查询,但是我们已经采用了该框架,所以我试图用Cake方法来完成。

可能吗?

回答

6

尝试做这样的事情:

$options['conditions'] = array(
      'Borrower.email LIKE' => $this->request->data['email'] // 'abc', 
      'loan.field' => '123') 

    $options['joins'] = array(
     array('table' => 'loans', 
       'alias' => 'loan', 
       'type' => 'INNER', 
       'conditions' => array(
        'borrower.id = loan.borrower_id') 
       ) 
      ); 

    $options['fields'] = array('borrower.email', 'loan.field'); 

    $test = $this->Borrower->find('all', $options); 

你将会看到一个SQL语句:

SELECT borrower.email, loan.field 
FROM borrowers AS borrower 
INNER JOIN loans AS loan 
    ON borrower.id = loan.borrower_id 
    AND loan.field = '123' 
WHERE borrower.email = 'abc' 

您的结果将是一个数组

{Borrower: {field:abc} LOAN: {field: 123} } 

你会发现更多信息请见document

2

我想我会接受Jose的答案,因为这正是我想要的。但我注意到,如果我使用其他模型作为我的出发点,我不需要任何花哨的技巧 - 没有连接或包含。

BorrowerhasManyLoan s和一个LoanbelongsTo一个Borrower。使用Loan作为我的模型,Cake会自动加入表格,但不会使用Borrower

$this->Loan->find('all', array(// Not $this->Borrower->find() ! 
'conditions' => array(
    'Borrower.field' => 'abc', 
    'Loan.field' => 123 
) 
));