フラットカタログを有効にすると、カテゴリコレクションをフィルタリングすると不正な動作が発生する


7

カテゴリの基本的な検索を実行するためのコードがあります。カテゴリ名と説明を検索することで機能します-両方がコアである属性。

私が持っているコードは次のとおりです:

$_categories = Mage::getModel('catalog/category')->getCollection()  
    ->addAttributeToSelect('name')
    ->addAttributeToSelect('description')
    ->addAttributeToSelect('associated_brand')
    ->addAttributeToSelect('image')
    ->setPageSize(12)
    ->setCurPage(1)
    ->addAttributeToFilter('level',['gt' => 2])
    ->addAttributeToFilter('is_active',['eq'=>true])
    ->addAttributeToFilter(
        [
            ['attribute' => 'name', 'like' => '%'.$searchterm.'%'],
            ['attribute' => 'description', 'like' => '%'.$searchterm.'%']
        ]
    )->load();

カテゴリに対してフラットカタログを有効にする前に、期待される結果(名前または説明が検索語と一致するカテゴリ)が返されました。

フラットカタログを有効にすると、名前または説明の検索が機能しません。基になるコレクションクエリを出力すると、次のようになります。

SELECT `main_table`.`entity_id`, `main_table`.`level`, `main_table`.`path`, `main_table`.`position`, `main_table`.`is_active`, `main_table`.`is_anchor`, `main_table`.`name`, `main_table`.`description`, `main_table`.`associated_brand`, `main_table`.`image` 
FROM `catalog_category_flat_store_1` AS `main_table` 
WHERE (level > 2) AND (is_active = '1')

上記からわかるように、名前と説明の句は完全に欠落しています。

生成されたcatalog_category_flat_store_1テーブルを確認しましたが、フィールドがそこにあります。

フラットカタログを使用している場合にのみ、Magentoがこれらのフィルターをクエリから削除する理由はありますか?

回答:


2

\Mage_Catalog_Model_Resource_Category_Flat_Collection::addAttributeToFilter

public function addAttributeToFilter($attribute, $condition = null)
{
    if (!is_string($attribute) || $condition === null) {
        return $this;
    }

    return $this->addFieldToFilter($attribute, $condition);
}

最初のパラメーターに配列を含めることはできません。フラットが有効になっている場合は、Selectオブジェクトを取得して手動でクエリを実行する必要があります。

この助けを願っています、


これは、フラットカタログ実装が標準のEAV実装とのインターフェイス互換性がない別の例にすぎませんか?
BrynJ 2015年

残念ながらそうです。これはカテゴリーの大きな問題です。プロジェクトを開始するときは、通常フラットまたはEAVを使い始めますが、プロジェクトのライフサイクルを変更することはありません。
bchatard

addFieldToFilter()代わりに直接使用するとどうなりますか?うまくいかない理由はわかりません
Fabian Schmengler、

はい、常にフラットを使用する場合にのみ機能します(EAVでは機能しません)
bchatard
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.