2

WHERE結合の両側に条件を設定して、結合からすべてのレコードを表示したいと考えています。

たとえば、私はLOANand BORROWER(joined on 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 つしかないため、単一の結果が得られると予想していました。代わりに、2 つの結果が得られます。

結果 1 は{Borrower: {field:abc, LOAN: {field: 123} }// 正しい

結果 2 は{Borrower: {field:abc, LOAN: {NULL} }// 不正解です

CakePHP が使用した SQL を見ると、結合が見当たりません。私が見ているのは、2 つの別々のクエリです。

クエリ 1: SELECT * from BORROWER // (yielding 2 IDs)

クエリ 2:SELECT * FROM LOAN WHERE borrower_id in (IDs)

これは私が望むものではありません。テーブルに参加して、条件を適用したい。SQL クエリは簡単に作成できましたが、Cake のフレームワークを採用したので、Cake の方法で実行しようとしています。

出来ますか?

4

2 に答える 2

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} }

詳細については、このドキュメントを参照してください。

于 2013-04-29T19:31:56.027 に答える