2012-10-18 1039 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' 
       ), 
     ),