私は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
あなたの検索キーワードは何ですか? –
$ 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これは私の情報を呼び出す前に、「 ) ) ) ) ) –
だから失われ、どこかのように見える..... 少なくともさらにデバッグのための良いスタートですそれ! –