1

ページ分割されたクエリで含まれるものを使用しようとしています。コードは以下のとおりです。

    $this->paginate = array(
        'conditions'=>array(
            'Track.pending'=>0,
            'Track.status'=>1
        ),
        'contain'=>array(
            'Vote'=>array(
                'conditions'=>array(
                    'Vote.created >'=>$start,
                    'Vote.created <='=>$end
                ),
                'fields'=>array(
                    'Vote.vote_type_id',
                    'Vote.id',
                ),
            ),
            'Artist'=>array(
                'Image'=>array(
                    'fields'=>array(
                        'Image.name'
                    )
                ),
                'Genre'=>array(
                    'fields'=>array(
                        'Genre.name'
                    )
                ),
                'fields'=>array(
                    'Artist.name',
                    'Artist.id',
                    'Artist.slug',
                    'Artist.city',
                    'Artist.genre_id'
                )
            )
        ),
        'fields'=>array(
            'Track.id',
            'Track.slug',
            'Track.name',
            'Track.featured',
            'Track.plays',
            'Track.vote_score',
            'Track.vote_week_score',
            'Track.video',
            'Track.status',
            'Track.created'
        ),
        'order'=>$order
    );

直接的な関連付け (Vote と Artist) は取り上げられますが、Image と Genre は取り上げられません。生成される SQL は次のとおりです。

SELECT COUNT(*) AS `count` FROM `tracks` AS `Track` LEFT JOIN `artists` AS `Artist` ON (`Track`.`artist_id` = `Artist`.`id`) WHERE `Track`.`pending` = 0 AND `Track`.`status` = 1

SELECT `Track`.`id`, `Track`.`slug`, `Track`.`name`, `Track`.`featured`, `Track`.`plays`, `Track`.`vote_score`, `Track`.`vote_week_score`, `Track`.`video`, `Track`.`status`, `Track`.`created`, `Artist`.`name`, `Artist`.`id`, `Artist`.`slug`, `Artist`.`city`, `Artist`.`genre_id` FROM `tracks` AS `Track` LEFT JOIN `artists` AS `Artist` ON (`Track`.`artist_id` = `Artist`.`id`) WHERE `Track`.`pending` = 0 AND `Track`.`status` = 1 ORDER BY `Track`.`vote_week_score` DESC LIMIT 20

SELECT `Vote`.`vote_type_id`, `Vote`.`id`, `Vote`.`track_id` FROM `votes` AS `Vote` WHERE `Vote`.`created` > '2011-09-26' AND `Vote`.`created` <= '2011-10-03' AND `Vote`.`track_id` IN (24, 35, 31, 25, 27, 34, 56, 58)

Cake は、より深い関連性を認識していません。これは Containable + paginate の制限ですか、それとも何か不足していますか?

ありがとう!

4

3 に答える 3

1

モデルの再帰プロパティの値がゼロかどうかを確認してください。

$this->Post->recursive = 0;

上記の行を削除して何時間もヘッドバンギングした後、修正されました

于 2013-12-31T15:26:05.223 に答える
0

必ず動作を添付してください。

$this->ModelName->Behaviors->attach('Containable');
于 2014-02-12T20:58:34.193 に答える
-2

AppController で設定している場合、おそらく問題はコントローラーの $uses です。

例:
コントローラが ProductsController で、モデルが Product で、データベース テーブルが products であるとします。また、モデルには何らかの関連付けが設定されている可能性があります。

Controller で $uses を設定せず、AppController で設定すると、Cake はデータベース テーブルを正しく推定し、正常に動作します。ただし、Model ファイルは $uses (AppController で定義されているファイル) に表示されないため、彼は探しません。

したがって、コントローラーに次のように記述すれば機能します。

public $uses = array('Yourmodel');

また:

  1. 「再帰」を設定する必要はありません。これが、contain が存在する理由です。
  2. 次の例のように、foreignKeys をフェッチすることを忘れないでください。 Product 'fields'=>array('category_id'); カテゴリ 'fields' =>'product_id'
于 2012-09-26T20:08:34.387 に答える