2012-10-18 1075 views
1

进出口试图复制在CakePHP中以下查询:使用find方法符合下列条件的上传模式将表添加到自定义查询CakePHP中

SELECT * 
FROM uploads, proposals 
WHERE proposals.id = uploads.proposal_id AND proposals.tender_id = 10 

林:

$conditions = array(
    'Proposal.id' => $id, 
    'AND' => array(
    'Upload.proposal_id' => 'Proposal.id' 
) 
); 
return($this->find('list', array('conditions' => $conditions))); 

,但即时通讯取而代之的是这个查询

SELECT `Upload`.`id`, `Upload`.`title` 
FROM `kumalabs_lic`.`uploads` AS `Upload` 
WHERE `Proposal`.`id` = 10 AND `Upload`.`proposal_id` = 'Proposal.id' 

正如你所看到的那样,提议表丢失了,可以索姆ebody解释我如何使这个查询?

谢谢:)

+1

你如何定义你的上传模式?它对提案模型有关系声明? – Habibillah

+0

上传属于Proposal,这里是代码:http://pastie.org/5079273 – kumiau

+0

看完你的代码后,我创建了一个答案来解决你的问题 – Habibillah

回答

0

如果模型有关联,CakePHP的自动'contain'关键字加入表。尝试代码波纹管:

public function getProposalsFromTender($id){ 
    $data = $this->find('all', array(
     'conditions' => array('Proposal.id' => $id), 
     'fields' => array('Upload.*', 'Proposal.*'), 
     'contain' => array('Proposal') 
)); 
    return($data); 
} 

注: CakePHP的使用显式连接,而不是隐式连接一样...from proposals, uploads...

+0

它的工作!只是一个问题,它适用于查找“所有”而不是“列表”。任何想法,为什么它可能是? – kumiau

+0

“list”的目的是获得数组的一个维度。您可以为'fields'关键字指定一个或两个作为数组键和另一个作为值的关键字。它也可以在'字段'上定义多于两个关键字,但不推荐恕我直言。 如果您需要获取“Proposal”列表,只需使用$ this-> Proposal-> find('list',...查看http://book.cakephp.org/2.0/en/models/retrieving-您的数据。HTML#查找列表 – Habibillah

0

我不熟悉的JOIN语法,但我相信这一点,等于:

SELECT * 
FROM uploads 
INNER JOIN proposals ON proposals.id = uploads.proposal_id 
WHERE proposals.tender_id = 10 

...所以你需要一些与此类似:

// Untested 
$conditions = array(
    'Proposal.id' => $id, 
    'joins' => array(
     array(
      'alias' => 'Proposal', 
      'table' => 'proposals', 
      'type' => 'INNER', 
      'conditions' => 'Proposal.id = Upload.proposal_id', 
     ), 
    ), 
); 

当然,这是您的JOIN的直接翻译。如果你的模型正确相关,它应该全部自动发生。

1

我建议你使用这种可链接的行为。这比在CakePHP中进行连接的默认方式要容易得多。它可以与最新版本的CakePHP以及1.3一起使用。

CakePHP Linkable Behavior

你会再修改您的发现,看起来像这样:

return($this->find('list', array(
    'link' => array('Proposal'), 
    'conditions' => array(
      'Proposal.id' => $id, 
    ), 
    'fields' => array(
      'Upload.*', 
      'Proposal.*', 
    ), 
))); 

CakePHP会自动加入您的主/外键,所以没必要有

'Upload.proposal_id' => 'Proposal.id' 

条件。

虽然你不需要这个条件,但我也想指出你做错了。这是你如何做到AND和OR CakePHP中

 'conditions' => array(
       'and' => array(
        'field1' => 'value1', // Both of these conditions must be true 
        'field2' => 'value2' 
       ), 
       'or' => array(
        'field1' => 'value1', // One of these conditions must be true 
        'field2' => 'value2' 
       ), 
     ),