如何在获取父模型时对子模型进行查询搜索?

时间:2014-01-20 09:21:06

标签: cakephp cakephp-2.3

我有以下设置:

  1. Job hasMany Quotation
  2. Quotation belongsTo Job
  3. Quotation hasMany QuotationsInBatch
  4. Batch hasMany QuotationsInBatch
  5. 我希望在以下条件下执行$this->find

    • Job.name或
    • Quotation.quotation_number或
    • Quotation.site_text

    检索以下结果:

    各种作业记录和属于作业的报价以及与报价相关的各种批次

    这意味着我输入abc

    • 一个Job.name匹配abc,我将显示该作业及其相关的报价和相关的批处理OR
    • a Quotation.quotation_number匹配abc,我将显示父作业及其所有相关报价和相关批次OR
    • 一个Quotation.site_text匹配abc,我将显示父作业及其所有相关报价和相关批次

    请告知。

    更新

    我让这个工作。但基本上,我使用find两次joins

    首先我这样做:

         $options =  array(
            'conditions'    => $conditions,
            'order'     => array(
                'Job.id' => 'DESC',
            ),
            'fields'    => $fields
        );
    
        $joins = array(
            array('table' => 'quotations',
                'alias' => 'Quotation',
                'type' => 'LEFT',
                'conditions' => array(
                    'Quotation.job_id = Job.id',
                )
            )
        );
        $options['joins'] = $joins;
    
        $results = $this->find('all', $options);
    

    由于我的条件主要涉及JobQuotation,因此我会使用这两个模型之间的连接进行搜索,并且仅返回Job.id

    之后,我检查是否有符合条件的作业,然后执行另一个查找。这一次,涉及其他相关模型。

        if ($results) {
            $ids = Hash::extract($results, '{n}.Job.id');
        } else {
            $ids = array('Job.id' => -1000); // put a fake id
        }
    
        $options['conditions'] = array('Job.id' => $ids);
        $joins[] = array('table' => 'quotations_in_batches',
                'alias' => 'QuotationInBatch',
                'type' => 'LEFT',
                'conditions' => array(
                    'Quotation.id = QuotationInBatch.quotation_id',
                )
            );
        $joins[] = array('table' => 'batches',
                'alias' => 'Batch',
                'type' => 'LEFT',
                'conditions' => array(
                    'Batch.id = QuotationInBatch.batch_id',
                )
            );
    

    然后使用这些选项执行find

    有没有比我更好的方法?

0 个答案:

没有答案