2011-06-22 34 views
0

我有一個表TblOrders,它們分別具有兩個字段,如FldOrderStatusId和FldInstrumentID作爲來自表TblOrderStatus和TblInstrumentMasters的表中的外鍵。這是可能的左表連接。代碼如下:應用左連接從多個表中使用外鍵提取數據

$find_filled_orders = $this->UserOrder->query(
    "Select distinct(FldOrderNumber) from TblOrders where FldOrderStatusId =12 "); 
$res_order=""; 
$i=0; 
foreach($find_filled_orders as $order_arr) 
{ 
    if($i!=0) 
    { 
     $res_order.=","; 
    } 
    $res_order.="'".$order_arr['TblOrders']['FldOrderNumber']."'"; 
    $i++;    
} 
$where_not_in=""; 
if($i>=1) 
{    
    $where_not_in = "AND FldOrderNumber NOT IN (".$res_order.")"; 
} 
//debugbreak(); 
$current_order = $this->UserOrder->query(
    "Select * from TblOrders where 1 ".$where_not_in. 
    " group by FldOrderNumber order by FldSlNo desc"); 

我想在最後一行查詢中應用左連接。請大家幫我解決。 在此先感謝。

回答

2

你確定你在使用Cake嗎? O_o對於這樣一個簡單的查詢,不需要原始的sql。如果你的表格和鍵名遵循Cake的慣例,Cake只需要在你的控制器中使用幾個鏈接方法就可以做到這一切。

我甚至不確定你想要完成什麼,但是我想你只是想把所有用戶的未填充樂器訂單的所有狀態,或者什麼?

確實需要在Cake中手動構建查詢,更不用說準備那樣的字符串了。讓框架完成繁重的工作。如果需要,可以將$ find_filled_orders寫成嵌套的SELECT語句(Cake爲其提供了優雅的支持)。否則,你只需要重新設置你的表格/模型,這樣你就可以正確地關聯它們,讓Cake完成剩下的工作。

你不顯示你想怎麼稱呼樂器,所以我不能更具體。但是,如果您定義它們並正確命名所有內容,Cake將自動爲相關模型生成連接。通過在訂單中添加一個名爲user_id的列來暗示訂單和用戶之間的關係。對於instruments_id和status_id也是如此,如果需要,對於表Users - order_id等等。蛋糕「外鍵」列不必實際定義在數據庫中被約束的外鍵,或者甚至包含任何數據。如果它讓你滿意,讓它們全都爲空。

$current_order = $this->Order->find('all', array(
    'conditions'=>array(
     'Order.status_id != 12', 
     'Order.status_id'=>'Status.id', 
     'Order.instrument_id'=>'Instrument.id' 
     ), 
    'fields'=>array('DISTINCT (Order.number) as number', 'name', 'other'), 
    'group'=> 'Order.number', 
    'order'=>'Order.fld_sl_no DESC' 
    ) 
); 

(團體和DISTINCT - 。在現實生活中,沒必要兩個我把它們都在證明的緣故)

http://book.cakephp.org/view/1002/Creating-Database-Tables

http://book.cakephp.org/view/1030/Complex-Find-Conditions

HTH 。 :)

+0

謝謝.... acctually我改變字段名,而不是蛋糕的命名約定.. –

+0

這裏是查詢:SELECT * FROM TblOrders LEFT JOIN TblInstrumentMasters ON TblOrders.FldInstrumentID = TblInstrumentMasters.FldInstrumentID LEFT JOIN TblOrderStatus ON TblOrders .FldOrderStatusId = TblOrderStatus.FldId其中1「。$ where_not_in。」由FldOrderNumber按FldSlNo desc命令排序 –