Я пытаюсь запустить запрос, но происходит что-то странное:
$return = MyCustomPage::get()->where(
" MyCustomPage.ID IN(" . implode(',', $MyCustomPageIds) . ")"
)->limit(2);
Это возвращает ошибку, потому что запрос пытается получить данные из MyCustomPage_Live вместо MyCustomPage.
Эта логика сохраняется как изменение, иногда она получается из одной таблицы иногда из другой, и мне нужно указать имя таблицы внутри запроса (например, MyCustomPage.ID или MyCustomPage_Live.ID)
Есть ли лучший способ для этого или любого решения?
Вы должны стараться избегать необработанных SQL-запросов, насколько это возможно, и использовать SilverStripe ORM вместо этого.
Таким образом, чтобы достичь того же результата, что и с вашим выражением where, но используя ORM, вы должны написать:
$return = MyCustomPage::get()->byIDs($MyCustomPageIds)->limit(2);
Это также будет автоматически считываться с текущего этапа. Если вам нужно заставить сцену читать, вы можете использовать что-то вроде:
// replace 'Live' with 'Stage' to read from stage.
Versioned::set_stage('Live');
В этих случаях также рекомендуется сохранить текущий этап и восстановить его после.
$currentStage = Versioned::get_stage();
Versioned::set_stage('Live');
// Do your thing…
Versioned::set_stage($currentStage);
Для этого вам не требуется инструкция where
, вы можете сделать что-то в соответствии с параметрами CustomPage::get()->filter(['ID' => $CustomPageArray])->limit(2)
. Массивы как второй аргумент в SilverStripe рассматриваются как запрос типа IN
. Использование filter
также автоматически решит проблему с версией, с которой вы столкнулись.
Если вам действительно нужно использовать where
нибудь, что-то вроде этого поможет:
$extra = '';
if (Versioned::current_stage() == 'Live') {
$extra = '_live'
}
Page::get()->where('MyFilter' . $extra . '.ID' IN implode(',', $CustomIds));
введите код сюда
(Извините за любые синтаксические ошибки;))