2012-10-24 107 views
1

我正在研究一個CakePHP項目,它在查詢結果順序時給了我一些問題。這裏有三個表格:建築物(建築物上的所有信息),列表和列表建築物(建築物和列表的鏈接表)。我沒有構建應用程序,不幸的是無法更改數據庫結構。我希望$arrBuildings成爲ListBuildings.created(意思是建築物被添加到列表中的那一刻)的建築物列表,而不是Building.name,因爲它看起來是現在。CakePHP查詢需要按JOIN列排序

function getList($list_id) { 
// Get buildings in the list 
$building_ids = $this->_getBuildingsForList($list_id); 
$conditions = array(
     'conditions'=>array('Building.id'=>$building_ids), 
     'contain' => array(
       'List'=>array('conditions' => array ('List.id'=>$list_id)))); 

// Get the list information 
$this->Building->List->recursive=-1; 
$List=$this->Building->List->read(null,$list_id); 

$options = array(
    'conditions' => array('Building.id'=>$building_ids), 
    'contain' => array(
     'List'=>array('conditions' => array ('List.id'=>$list_id)), 
     'Sqft' 
    ), 
); 


$this->Building->myId=$this->getUserId(); 
$arrBuildings = $this->Building->find('all', $options); 
print_r($arrBuildings); 
} 

由於我使用CakePHP,MVC的模型部分似乎是正確設置。與上面的代碼,print_r顯示以下的數組:

Array ([0] => Array ( 
[Building] => Array ( 
    [id] => 105 
    [name] => Stark Tower 
    [address] => 123 Main St. 
) 
[Sqft] => Array ( 
    [0] => Array ( 
     [id] => 51 
     [list_id] => 113 
     [building_id] => 105 
     [sq_feet] => 2200.000 
    ) 
) 
[List] => Array ( 
    [0] => Array ( 
     [id] => 113 
     [title] => Awesome buildings 
     [ListBuilding] => Array ( 
      [id] => 95 
      [list_id] => 113 
      [building_id] => 105 
      [created] => 2012-10-18 09:40:00)))) 

要重新狀態:如何訂購查詢(和得到的陣列)通過ListBuildings.Created 我試圖匿名的代碼,並可能已經搞砸了一些東西,所以讓我知道,如果有什麼沒有意義:) 在此先感謝您的任何反饋!

+0

你的加入在哪裏?我沒有看到它 –

+0

@BarryChapman,CakePHP在其模型「hasandbelongstomany」結構中加入這些表。所有這些「自動化」的東西讓我頭暈目眩。 – JamieHoward

+0

啊,我以爲你是在明確地加入你的發現。 –

回答

1

再看看你的功能,我認爲最好從頭開始。

更改模型關係到:

Building belongsTo ListBuildingListBuilding hasMany BuildingList belongsTo ListBuilding,最後ListBuilding hasMany List

重寫你的函數

function getList($list_id) { 
    $options = array(
     'conditions' => array(
      'ListBuilding.list_id' => $list_id 
     ), 
     'contain' => array(
      'Sqft' 
     ), 
     'order' => 'ListBuilding.created', 
    ); 

    $arrBuildings = $this->Building->find('all', $options); 
    print_r($arrBuildings); 
    } 

這真的沒有比這更復雜。

+0

Ahhhh。這是完美的,除了我正在處理的應用程序不是。哈哈。不是你的問題,但模型關係都是錯誤的,所以改變它們會打破所有其他問題。好吧。由於它在理論上是正確的,因此將其標記爲答案。 – JamieHoward

1

我發現當你在連接表上有額外的數據時,最好暫時做一些臨時綁定,以使它成爲hasMany和belongsTo到關聯。所以Building有很多ListBuild和ListBuild belongsTo List。然後,您可以使用包含來過濾所需的數據,並使用包含中的順序給出所需的結果。