2011-12-07 14 views
1

翻訳動作にタイトルと説明の2つのフィールドが付いたモデルがあります。 翻訳可能なフィールドにいくつかの条件を追加しました。 いつものように、ページ分割では、CakePHPは最初にカウントを行い、すべてのレコードを取得します。 クエリの合計レコードをフェッチ:国際化テーブルはi18n_ タイトルや国際化 _descriptionとしてではなくi18nmodelしかしCakePHP翻訳動作と改ページ数

として参加していないので、

1054: Unknown column 'I18n__description.content' in 'where clause' 

:私が得る

SELECT COUNT(DISTINCT(`product`.`id`)) AS COUNT 
FROM `products` AS `product` 
    INNER JOIN `i18n` AS `i18nmodel` 
    ON (`product`.`id` = `i18nmodel`.`foreign_key` 
      AND `i18nmodel`.`model` = 'Product' 
      AND `i18nmodel`.`locale` = 'eng') 
    LEFT JOIN `categories` AS `category` 
    ON (`product`.`category_id` = `category`.`id`) 
    LEFT JOIN `vats` AS `vat` 
    ON (`product`.`vat_id` = `vat`.`id`) 
    LEFT JOIN `availables` AS `available` 
    ON (`product`.`available_id` = `available`.`id`) 
WHERE ((`i18n__description`.`content` LIKE '%test%') 
     OR (`i18n__title`.`content` LIKE '%test%') 
     OR (`product`.`code` LIKE '%test%')) 

をページングがクエリの行(全レコードではない)を取得しようとすると、すべて正常に機能します。これには何か解決策はありますか?

コントローラーのコードは次のようなものだ:

$condition = array(); 
foreach ($search as $word) { 
if (strlen($word) > 0) 
$condition[] = array('OR' => array('I18n__description.content LIKE' => '%' . $word . '%','I18n__title.content LIKE' => '%' . $word . '%', 
         'Product.code LIKE' => '%' . $word . '%')); 
} 

$conditions = array('AND' => $condition); 
$products = $this->paginate($conditions); 
+0

コントローラコードを投稿できますか? –

+0

私は条件付きで部品を追加しました。 – mentalic

答えて

2

この場合は単にあなたがページ付けするモデルのカスタムpaginateCountメソッドを作成することによって処理することができます。

function paginateCount($conditions = array(), $recursive = null, $extra = array()) { 
    return count($this->find('all', array('conditions' => $conditions))) 
} 
1

改ページカウンタは変換結合を使用しないため、検索する前に手動で結合する必要があります。 FindAllは、comlicatedクエリを実行し、サーバーリソースを奪うので、あまり良い解決策ではありません。

https://github.com/cakephp/cakephp/issues/1753

溶液です。これはSmoothTranslateの動作では機能しませんが、上記のコードを少し変更すれば動作する可能性があります。 前の検索を上書きします。

function beforeFind($queryData){ 
    if(!empty($this->actsAs['SmoothTranslate']['fields'])){ 
     foreach($this->actsAs['SmoothTranslate']['fields'] as $trkey=>$trval){ 
      if(!is_string($trkey)) $trkey=$trval; 

      $joinFound=false; 
      foreach($queryData['joins'] as $join){ 
      if($join['alias']=='I18n__'.$trkey){ 
       $joinFound=true; break; 
      } 
      } 
      if(!$joinFound){ 
      $newJoin = array(
       'type'=>'LEFT', 
       'table'=>'i18n', 
       'alias'=>'I18n__'.$trkey, 
       'conditions'=>array(
       $this->alias.'.id'=>Set::map(array(
        'type'=>'identifier', 
        'value'=>'I18n__'.$trkey.'.foreign_key', 
       )), 
       'I18n__'.$trkey.'.model'=>$this->alias, 
       'I18n__'.$trkey.'.locale'=>$this->locale, 
       'I18n__'.$trkey.'.field'=>$trkey, 
      ), 
      ); 
      array_push($queryData['joins'], $newJoin); 
      } 
     } 

    } 
    return $queryData; 
    } 
} 
+0

ありがとうございますが、http://stackoverflow.com/questions/how-to-answer、特に「リンクのコンテキストを提供する」の部分を読んでください。 –

+0

私の初心者ここ:) – lamasgergo

関連する問題