今のところ、特定のカテゴリから本を取得するために次のコードを使用しています。
$options['conditions']['Category.id'] = $category_id;
$options['joins'] = array(
array(
'table' => 'books_categories',
'alias' => 'BookCategory',
'type' => 'inner',
'conditions' => array('Book.id = BookCategory.id_book'),
),
array(
'table' => 'categories',
'alias' => 'Category',
'type' => 'inner',
'conditions' => array('BookCategory.kat = Category.id'),
),
);
$this->Book->find('all',$options);
これは、指定された category_id からすべての本を検索するだけです。
したがってcategories
、 、books
および の 3 つのテーブルがありbooks_categories
ます。books_categories には 2 つのフィールドがあります。つまりbook_id
、基本的にはcategory_id
単なる HABTM 関係です。問題は、1 つの本が多くのカテゴリに属している可能性があることです。たとえば、カテゴリ 5 のすべての本を検索し、カテゴリ 5、6、および 7 の本を除外したいと考えています。これを行うにはどうすればよいですか?
編集 - - - - - - - - - - - - - - - - - - - - - - - - - ------------------------------
わかりましたので、純粋なSQLでどのように見えるかを理解しました-条件は次のようになります。
where
category_id = <given category>
and books.book_id not in
(
select book_id from book_categories
where category_id in (<given set of cat>)
)
order by books.inserted
これにより、1 つのカテゴリからすべての本が取得されますが、他の一連のカテゴリからの本は除外されます。ここで、Cake に同様の SQL クエリを強制的に生成させたいと考えています。私はこれまでに試しました:
$options['conditions']['Category.id'] = $category_id;
$options['conditions']['AND'][] = 'Book.id NOT IN (SELECT id_book FROM book_categories WHERE kat IN (133,134))';
$options['order'] = array('Book.inserted' => 'desc');
$options['joins'] = array(
array(
'table' => 'book_categories',
'alias' => 'BookCategory',
'type' => 'inner',
'conditions' => array('Book.id = BookCategory.id_book'),
),
array(
'table' => 'categories',
'alias' => 'Category',
'type' => 'inner',
'conditions' => array('BookCategory.kat = Category.id'),
),
);
これにより、次のクエリが生成されます (申し訳ありませんが、テーブル名は少し異なります)。
SELECT `Book`.`id`, `Book`.`OK`, `Book`.`price`, `Book`.`link`, `Book`.`title`,
`Book`.`author`, `Book`.`img`, `Book`.`inserted`, `Book`.`checked`, `Book`.`big_img`, `Book`.`lang`, `Book`.`asin`, `Book`.`description`, `Book`.`last_update`, `Book`.`review`, `Book`.`changed`
FROM `amazon`.`linki` AS `Book`
inner JOIN `amazon`.`cross_kategorie_full` AS `BookCategory` ON (`Book`.`id` = `BookCategory`.`id_book`)
inner JOIN `amazon`.`kategorie` AS `Category` ON (`BookCategory`.`kat` = `Category`.`id`)
WHERE `Category`.`id` = 4
AND `Book`.`OK` = 'OK'
AND ((`Book`.`big_img` NOT LIKE '%no-image%')
AND (`Book`.`id` NOT IN (SELECT id_book FROM cross_kategorie_full WHERE kat IN (133,134))))
ORDER BY `Book`.`inserted` desc LIMIT 20
しかし、エラーがあります: 最大実行時間が 30 秒を超えました - この sql ステートメントで終了しないもの (ループ?) があります...