CakePHP查询需要按联接列排序

CakePHP查询需要按联接列排序,php,cakephp,join,cakephp-model,Php,Cakephp,Join,Cakephp Model,我正在从事一个CakePHP项目,它在查询结果顺序时给了我一些问题。这里使用三个表:建筑物(建筑物的所有信息)、列表和ListBuildings(建筑物和列表的链接表)。不幸的是,我没有构建应用程序,无法更改数据库结构。我希望$arrBuildings是按ListBuildings.created(意思是将一栋建筑添加到列表中的那一刻)而不是按building.name的顺序排列的建筑列表 function getList($list_id) { // Get buildings in t

我正在从事一个CakePHP项目,它在查询结果顺序时给了我一些问题。这里使用三个表:建筑物(建筑物的所有信息)、列表和ListBuildings(建筑物和列表的链接表)。不幸的是,我没有构建应用程序,无法更改数据库结构。我希望
$arrBuildings
是按
ListBuildings.created
(意思是将一栋建筑添加到列表中的那一刻)而不是按
building.name
的顺序排列的建筑列表

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 ))))
重新声明:如何按
列表建筑物对查询(和结果数组)进行排序。已创建
我试图匿名化代码,可能弄错了什么,所以如果有任何不合理的地方,请告诉我:)
提前感谢您的反馈

我发现,当您在联接表上有额外的数据时,最好是动态地进行一些临时绑定,使其成为关联的多个和多个属性。所以建筑有许多ListBuild和ListBuild属于列表。然后,您可以使用contains来过滤所需的数据,还可以使用contain中的顺序来提供所需的结果。

再次查看了您的函数后,我认为最好从零开始

将模型关系更改为:

建筑属于列表建筑
列表建筑有许多建筑
列表属于列表建筑
,最后
列表建筑有许多列表

重写你的函数

    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);
    }

其实没有必要比这更复杂。

您的加入地点在哪里?我不明白it@BarryChapman,CakePHP在其模型“hasandbelongtomany”结构中连接这些表。所有这些“自动”的东西让我头晕目眩。啊,我还以为你是在明确加入你的发现。啊。这是完美的,除了我正在处理的应用程序不是。哈哈。这不是你的问题,但模型关系都设置错误,因此更改它们会破坏其他一切。哦,好吧。因为理论上是正确的,所以将此标记为答案。