CakePHP find joined records with conditions on each table

人走茶凉 提交于 2019-12-07 20:03:40

问题


I want to see all the records from a join, setting a WHERE condition on each side of the join.

For example, I have LOAN and BORROWER (joined on borrower.id = loan.borrower_id). I want the records where LOAN.field = 123 and BORROWER.field = 'abc'.

The answers here (this one, for example) seem to say that I should use Containable.

I tried that. Here's my code:

$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
        )
    )
)); 

I expected to have a single result because in my data, there is only one joined record with both of those conditions. Instead, I get two results,

Result 1 is {Borrower: {field:abc, LOAN: {field: 123} } // correct

Result 2 is {Borrower: {field:abc, LOAN: {NULL} } // incorrect

When I look at the SQL that CakePHP used, I don't see a join. What I see is two separate queries:

Query 1: SELECT * from BORROWER // (yielding 2 IDs),

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

This is not what I want. I want to join the tables, then apply my conditions. I could easily write the SQL query, but am trying to do it the Cake way since we've adopted that framework.

Is it possible?


回答1:


Try to do something like this:

    $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);

You should see a SQL statement like:

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'

Your results will be in an array

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

You will find more information in this document.




回答2:


I think I'll accept Jose's answer because it's exactly what I want. But I did notice that I didn't need any fancy tricks -- no joins or contains -- if I used the other model as my starting point.

A Borrower hasMany Loans, and a Loan belongsTo a Borrower. Using Loan as my model, Cake will automatically join the tables, but not using Borrower.

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


来源:https://stackoverflow.com/questions/16285706/cakephp-find-joined-records-with-conditions-on-each-table

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!