加入两个表并在cakephp的第三个控制器中显示数据

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

我有三个模型 Quotation、QuotationItem 和 Job。 我的主要 Objective 是在作业控制器中为 table 的 Quotation 和 QuotationItem 进行左连接。我无法实现它,因为左连接中使用的不是 QuotationItem 作业 table!

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

您需要 运行 在报价单上查找,而不是在工作上查找。模型与 table 相关联,将它们视为一体。您无法从另一个 table 中找到与您正在执行查找功能的模型无关的内容。

如果您在加载模型时得到 sql 42000 error. Table/alias not unique,则它要么已经被加载,要么您正在尝试使用已经用于其他东西的名称来别名 - 您不能这样做.

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

无论您以何种方式访问​​ Quotation,您接下来要做的是:

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

终于让我的连接工作了