1

クエリ結果の順序に関して問題が発生している CakePHP プロジェクトに取り組んでいます。ここでは、Buildings (建物に関するすべての情報)、Lists、および ListBuildings (建物とリストのリンク テーブル) の 3 つのテーブルが使用されています。私はアプリケーションをビルドしていないため、残念ながらデータベース構造を変更できません。私は、現在のように見えるのではなく、(建物がリストに追加された瞬間を意味する)$arrBuildings順序で建物のリストになりたいと考えています。ListBuildings.createdBuilding.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 ))))

もう一度言います: クエリ (および結果の配列) を次の順序で並べ替えるにはどうすればよい ListBuildings.Createdですか? 私はコードを匿名化しようとしましたが、何かを台無しにしてしまった可能性があります。意味をなさないものがある場合はお知らせください :) フィードバックをお寄せいただきありがとうございます。

4

2 に答える 2

1

あなたの機能をもう一度見てみましたが、ここから始めるのが最善だと思います。

モデルの関係を次のように変更します。

Building belongsTo ListBuilding、、、そして最後ListBuilding hasMany Buildingに。List belongsTo ListBuildingListBuilding 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);
    }

それ以上に複雑である必要はありません。

于 2012-10-25T15:30:13.250 に答える
1

結合テーブルに追加のデータがある場合は、その場でいくつかの一時的なバインドを実行して、関連付けに hasMany および belongsTo にする方がよいことがわかりました。したがって、Building hasMany ListBuild と ListBuild belongsTo List です。次に、contains を使用して必要なデータをフィルタリングし、contains 内の順序を使用して目的の結果を得ることができます。

于 2012-10-25T15:12:54.323 に答える