首页 文章

CakePHP在每个表上查找具有条件的连接记录

提问于
浏览
2

我想查看连接中的所有记录,在连接的每一侧设置 WHERE 条件 .

例如,我有 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方式执行它,因为我们已经采用了该框架 .

可能吗?

2 回答

  • 2

    尝试做这样的事情:

    $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中找到更多信息 .

  • 6

    我想'll accept Jose'的答案是因为它需要任何花哨的技巧 - 没有连接或包含 - 如果我使用其他模型作为我的起点 .

    A Borrower hasMany Loan s和 Loan belongsTo a Borrower . 使用 Loan 作为我的模型,Cake将自动连接表,但不使用 Borrower .

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

相关问题