4

これが 100,000 回も聞かれていることは理解していますが、100,000 件すべての返信をほとんど読みましたが、どれも私の求めているものと一致していないようです。私は考えられるすべての組み合わせを試しましたが(明らかにそうではありません)、比較的単純なものに打ち負かされているのではないかと心配しています。これは私の 2 番目の Cake プロジェクトなので、決して専門家ではありません。

プロファイル ->所属-> 店舗、店舗 ->所属-> 地域、地域 -> HasMany -> 店舗

プロファイル.php

class Profile extends AppModel {  
public $belongsTo = array(
            'Store' => array(
                'className' => 'Store',
                'foreignKey' => 'store_id'....

.phpを保存

class Store extends AppModel {
public $belongsTo = array(
        'Region' => array(
            'className' => 'Region',
            'foreignKey' => 'region_id'....

リージョン.php

class Region extends AppModel {
public $hasMany = array(
        'Store' => array(
            'className' => 'Store',
            'foreignKey' => 'region_id'....

プロファイルコントローラー.php

$this->Paginator->settings = array(
    'conditions' => array('Profile.job_title_id' => '1'),
    'contain' => array(
        'Store'=> array(
            'Region'
        )
    )
);
$UserArds = $this->Paginator->paginate('Profile');
$this->set(compact('UserArds'));

.phpを表示

<th><?php echo $this->Paginator->sort('Region.name', 'Region'); ?></th>

私がやろうとしているのは、ページネーターを使用するときに地域名でソートできるようにすることだけです。どの組み合わせを使用しても、Region.name を並べ替えることができないようです。このorder By句は、他のすべての深さ 2 レベルの関連付けでは省略されますが、それ以外の場合 (同じレベルまたは第 1 レベル) では正常に機能します。

誰でもこの単純な間違いの修正を提案できますか?

4

1 に答える 1

8

SQL デバッグ出力を見てください。領域は個別のクエリを使用して取得されています。それが Cakes ORM の現在の動作です。

あなたの場合、比較的簡単な回避策があります。たとえば、その場で適切な関連付けを作成するだけProfile belongsTo Regionです。

これは (テストされていない) 例です。ORMによる自動外部キー生成を無効にするために、 に設定されたオプションとのbelongsTo関連付けを追加します。したがって、構成も変更する必要があることに注意してください。foreignKeyfalseProfile.region_idcontain

$this->Profile->bindModel(array(
    'belongsTo' => array(
        'Region' => array(
            'foreignKey' => false,
            'conditions' => array('Region.id = Store.region_id')
        ),
    )
));

$this->Paginator->settings = array(
    'conditions' => array('Profile.job_title_id' => '1'),
    'contain' => array('Store', 'Region')
);

storesこれにより、 とregionsテーブルを含む適切なクエリが生成され、でソートできるようになりますRegion.name。結果の配列は少し異なり、RegionネストされずStore、すべてが同じレベルに配置されることに注意してください。つまり:

Array
(
    [Profile] => Array
        (
            ....
        )

    [Store] => Array
        (
            ....

        )

    [Region] => Array
        (
            ....

        )
)

それに応じてビュー コードを変更するか、取得したデータをビューに渡す前に変換します。3 番目のオプションは、構成にネストされたものを含めることRegionですcontainが、データがメイン クエリで既にフェッチされているため、完全に不要な追加のクエリが発生するため、お勧めしません。

于 2013-09-23T18:44:46.820 に答える