2017-08-21 9 views
0

私はContentsを持っています。これは異なるTagGroupに属するタグを持つことができます。私は次のような非常に複雑な検索条件を持っています: 同じタググループに属している限り、検索の少なくとも1つのタグでタグ付けされているコンテンツは一致します。複雑なHABTM検索に使用されていない結合CakePhp 2

例: タググループ1は色、TagGroup2はシェイプです。 コンテンツに "青"、 "ターコイズ"、 "長方形"のタグが付いている場合、 "青"と "長方形"を検索すると見つかります。 この例は、複合体。

コンテンツ - > ContentsTag < - タグ - > TagGroup

私はそれが働いていた結果のページングを使用して検索を開発したいのですが、リファクタリングとフレームワークの間でそれが壊れて更新します。

ある時点では、結合に関する情報が失われ、テーブルが見つからないためにSQLがクラッシュしています。以下のSQLで

array(
    'limit' => (int) 10, 
    'order' => array(
     'Content.objnbr' => 'asc' 
    ), 
    'joins' => array(
     (int) 0 => array(
      'table' => 'sang_contents_tags', 
      'alias' => 'CT1', //join for the first TagGroup 
      'type' => 'INNER', 
      'conditions' => array(
       (int) 0 => 'CT1.content_id = Content.Id' 
      ) 
     ), 
     (int) 1 => array(
      'table' => 'sang_contents_tags', 
      'alias' => 'CT2', //join for the second TagGroup 
      'type' => 'INNER', 
      'conditions' => array(
       (int) 0 => 'CT2.content_id = Content.Id' 
      ) 
     ) 
    ), 
    'conditions' => array(
     'AND' => array(
      (int) 0 => array(
       'OR' => array(
        (int) 0 => array(
         'CT1.tag_id' => '189' // chosen Tag 1 from the first TagGroup 
        ) 
       ) 
      ), 
      (int) 1 => array(
       'OR' => array(
        (int) 0 => array(
         'CT2.tag_id' => '7' // chosen Tag 2 from the second TagGroup 
        ) 
       ) 
      ) 
     ) 
    ), 
    'contain' => array(
     (int) 0 => 'Description', 
     'ContentsTag' => array(
      'Tag' => array(
       (int) 0 => 'Taggroup' 
      ) 
     ) 
    ) 
) 

結果:

SELECT `Content`.`id`, `Content`.`objnbr`, `Content`.`name`, `Content`.`imagecounter`, `Content`.`videolength`, `Content`.`money_maker`, `Content`.`comment` 
FROM `my_db`.`contents` AS `Content` 
    WHERE ((`CT1`.`tag_id` = '189') AND (`CT2`.`tag_id` = '7')) 
ORDER BY `Content`.`id` DESC 
LIMIT 20 

だからはっきりタグCT1とCT2が連結されていないと、私のSQLがクラッシュしています。

包含が結合をブロックしている可能性はありますか?私が含まれていない場合、私はまだ同じ結果/エラーを取得します。

アイデア?

編集:私が達成したいものを、明確にする: 結果は、このようなSQLステートメントでなければなりません:

SELECT `Content`.`id`, `Content`.`objnbr`, `Content`.`name`, `Content`.`imagecounter`, `Content`.`videolength`, `Content`.`money_maker`, `Content`.`comment` 
FROM 
    `my_db`.`contents` AS `Content` 
     INNER JOIN 
    contents_tags AS CT1 ON CT1.content_id = Content.Id 
     INNER JOIN 
    contents_tags AS CT2 ON CT2.content_id = Content.Id 
WHERE 
    ((`CT1`.`tag_id` = '189') 
     AND (`CT2`.`tag_id` = '7')) 
ORDER BY `Content`.`id` DESC 
LIMIT 10 

トラブルがページネーションによって引き起こされているように見えます。検索によって

$result = $this->Content->find('all', $this->paginate['Content']); 

生成されたクエリ::私は「シンプル」を実行した場合、私はタグに基づいてコンテンツを取得見つける

SELECT 
    `Content`.`id`, 
    `Content`.`objnbr`, 
    `Content`.`name`, 
    `Content`.`imagecounter`, 
    `Content`.`videolength`, 
    `Content`.`money_maker`, 
    `Content`.`comment` 
FROM 
    `my_db`.`contents` AS `Content` 
     INNER JOIN 
    `my_db`.`contents_tags` AS `CT0` ON (`CT0`.`content_id` = `Content`.`Id`) 
     INNER JOIN 
    `my_db`.`contents_tags` AS `CT2` ON (`CT2`.`content_id` = `Content`.`Id`) 
WHERE 
    ((`CT0`.`tag_id` = '56') 
     AND (`CT2`.`tag_id` = '7')) 
ORDER BY `Content`.`objnbr` ASC 
+0

あなたの検索キーワードは何ですか? –

+0

$ result = $ this-> Paginator-> paginate($ this-> modelClass、$ this-> param);の$ this - > modelClass = 'コンテンツ' と ます$ this->のparam = 配列( 'AND' =>配列( (INT)0 =>配列( 'OR' =>配列(と (int)0 =>配列( 'CT1。TAG_ID '=> '189' ) ) )、 (INT)1 =>アレイ( 'OR'=>配列( (INT)0 =>配列( ''=>' CT2.tag_id 7これは私の情報を呼び出す前に、「 ) ) ) ) ) –

+0

だから失われ、どこかのように見える..... 少なくともさらにデバッグのための良いスタートですそれ! –

答えて

0

私はページネーションクラスの腸の研究を行なったし、私の結論は私はこの複雑なクエリに必要な特別な結合を渡すことができないため、現在のPaginatorで作業することはできません。

カスタム検索タイプも役立ちません。なぜなら、私のクエリはあまりにも動的なためです。

誰かが私を間違っていると分かったら、私は幸せなコーダーになります。

関連する問題