Использование 10+ полей с TranslateBehavior (вызывающее 10+ внутренних объединений) возвращает ошибку SQL

Я создаю проект, в котором хочу использовать CakePHP Translate Поведение.

Казалось, все работает нормально, пока я не достиг 10 полей, которые хотел перевести. Поведение перевода создает ВНУТРЕННЕЕ СОЕДИНЕНИЕ для каждого поля, которое оно пытается получить, что, я считаю, и является причиной этой ошибки (происходит только с 10+):

SQLSTATE[42000]: синтаксическая ошибка или нарушение прав доступа: 1104 SELECT проверит более MAX_JOIN_SIZE строк; проверьте свой WHERE и используйте SET SQL_BIG_SELECTS=1 или SET MAX_JOIN_SIZE=#, если SELECT в порядке

Два вопроса:

1) Я попытался исправить это, выполнив две перечисленные команды SQL, но все равно не повезло - как я могу заставить его работать?

2) Идеально/нормально/приемлемо ли иметь 10-20+ переведенных полей, если для каждого из них будет создано ВНУТРЕННЕЕ СОЕДИНЕНИЕ? Должен ли я переосмыслить использование этого поведения и, возможно, создать что-то свое?


person Dave    schedule 11.09.2013    source источник


Ответы (2)


Пробовали ли вы еще SET OPTION SQL_BIG_SELECTS = 1 на https://stackoverflow.com/a/950576/182823

person kicaj    schedule 12.09.2013

1: Это параметр безопасности mysql, который вы можете переопределить. Используйте этот код перед фильтром в контроллере приложения, чтобы избежать этой ошибки.

function beforeFilter() {  
$this->{$this->modelClass}->query('SET SQL_BIG_SELECTS=1'); 
...
}

2: Это нормально, чтобы присоединиться к таблице, умноженной на несколько, но несколько советов:

  • всегда используйте индексы! без индексов ячеек таблицы запрос может быть медленным

  • если у вас есть много переводимых данных во многих таблицах, используйте отдельные таблицы для перевода, например, если у вас есть Contents и Posts, используйте Content_I18n и Post_I18n http://book.cakephp.org/2.0/en/core-library/behaviors/translate.html -> Множественные модели перевода

  • вы можете переопределить поведение перевода. Я использую SmoothTranslate Behavior http://bakery.cakephp.org/articles/sky_l3ppard/2010/01/05/smoothtranslate-to-make-smooth-translations Я думаю, что лучший способ использовать поведение Translate или расширить его, не писать собственный, это хорошо достаточно в CakePhp. И в Cake 3 будет лучше. (надеюсь)

person lamasgergo    schedule 18.11.2013
comment
Это отвечает на часть 1 (если это работает), но не на часть 2. Есть мысли по этому поводу? - person Dave; 19.11.2013