连接两个表,并在cakepp中的第三个控制器中显示数据


Join two tables and display the data in in the third controller in cakephp

我有三个模型Quotation、QuotationItem和Job。我的主要目标是对Job控制器中的Quotation和QuotationItem表进行左联接。我无法实现它,因为左联接中使用的不是QuotationItem,而是作业表!

      $this->Job->unbindModel(
    array('belongsTo' => array('Quotation','QuotationItem')), true
);
            $options = array(
'fields' => array(
    'QuotationItem.id',
    'QuotationItem.Quot_id',
    'QuotationItem.item_sno',
    'QuotationItem.job_desc',
    'QuotationItem.selected_qty',
    'QuotationItem.paper_id',
    'QuotationItem.plate_id',
    'QuotationItem.design_id',
    'QuotationItem.ink_id',
    'QuotationItem.misel_id',
    'QuotationItem.plate_size',
    'QuotationItem.paper_size',
    'QuotationItem.paper_type',
    'QuotationItem.paper_gsm',
    'QuotationItem.plate_qty',
    'QuotationItem.paper_qty',
    'QuotationItem.ink_qty',
    'QuotationItem.plate_color',
    'QuotationItem.ink_color',
    'QuotationItem.ink_code',
    'QuotationItem.plate_price',
    'QuotationItem.paper_price',
    'QuotationItem.ink_price',
    'QuotationItem.design_price',
    'QuotationItem.plate_total',
    'QuotationItem.paper_total',
    'QuotationItem.ink_total',
    'QuotationItem.design_total',
    'QuotationItem.printing_cost',
    'QuotationItem.prepress_cost',
    'QuotationItem.design_cost',
    'QuotationItem.press_cost',
    'QuotationItem.folding_cost',
    'QuotationItem.binding_cost',
    'QuotationItem.block_cost',
    'QuotationItem.lamination_cost',
    'QuotationItem.uv_cost',
    'QuotationItem.stamping_cost',
    'QuotationItem.diecutting_cost',
    'QuotationItem.sewing_cost',
    'QuotationItem.perfectbind_cost',
    'QuotationItem.saddlestitch_cost',
    'QuotationItem.emboss_cost',
    'QuotationItem.cutting_cost',
    'QuotationItem.labor_charges',
    'QuotationItem.others',
    'QuotationItem.cost_total',
    'QuotationItem.total_item_sum',
    'QuotationItem.net_total',
    'QuotationItem.created',
    'QuotationItem.modified',
    'QuotationItem.status',
    'Quotation.Quot_id',
    'Quotation.job_item',
    'Quotation.customer_id',
    'Quotation.customer_name',
    'Quotation.customer_phone',
    'Quotation.customer_email',
    'Quotation.customer_address',
    'Quotation.salesperson',
    'Quotation.pay_terms',
    'Quotation.contact_id',
    'Quotation.status',
    'Quotation.discount',
    'Quotation.total',
    'Quotation.created',
    'Quotation.modified',
),
'joins' => array(
    array(
        'table' => 'quotation',
        'alias' => 'Quotation',
        'type' => 'left',
                    'conditions' => array('QuotationItem.Quot_id = Quotation.Quot_id'),
    )
),
'conditions' => array(
    '1',
));$data = $this->Job->find('all', $options);`

您需要在Quotation上运行find,而不是在Job上。模特们被绑在一张桌子上,把他们想象成一张桌子。你无法从不同的表中找到与你正在执行查找功能的模型无关的东西。

如果你在加载模型时得到sql 42000 error. Table/alias not unique,它要么已经加载,要么你试图用一个已经用于其他东西的名称来别名——这是你不能做的。

如果您还没有很好地掌握模型关联,那么确保您可以从作业控制器访问所有3个模型的最简单方法是在作业控制器中声明public $uses = array('Job','Quotation','QuotationItem');

无论你以何种方式访问报价,你想做的就是:

$this->Quotation->find('all',array(
    'fields' => '*',
    'joins' => array(
        array(
            'table' => 'quotation',
            'alias' => 'Quotation',
            'type' => 'left',
            'conditions' => array(
                'QuotationItem.Quot_id = Quotation.Quot_id'
            )
        )
    )
));

感谢@Tim让我了解了模型和控制器。我已经找到了问题的答案。我在QuotationItem模型中使用了联接,因为QuotationItem属于Quotation。

public $belongsTo = array(
    'Quotation' => array(
        'className' => 'Quotation',
        'foreignKey' => 'Quot_id',
        'type'=>'left',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    )
);

然后我在作业控制器中声明了public $uses = array('Job','Quotation','QuotationItem');之后,在我的添加功能中,我使用了

$quotationItem=$this->QuotationItem->find('all');
$this->set(compact( 'quotationItem'));

最后我加入了