SQL-логика Silverstripe

0

Я пытаюсь запустить запрос, но происходит что-то странное:

$return = MyCustomPage::get()->where(
    " MyCustomPage.ID IN(" . implode(',', $MyCustomPageIds) . ")"
)->limit(2);

Это возвращает ошибку, потому что запрос пытается получить данные из MyCustomPage_Live вместо MyCustomPage.

Эта логика сохраняется как изменение, иногда она получается из одной таблицы иногда из другой, и мне нужно указать имя таблицы внутри запроса (например, MyCustomPage.ID или MyCustomPage_Live.ID)

Есть ли лучший способ для этого или любого решения?

Теги:
silverstripe

2 ответа

5
Лучший ответ

Вы должны стараться избегать необработанных 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);
1

Для этого вам не требуется инструкция 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));

введите код сюда

(Извините за любые синтаксические ошибки;))

Ещё вопросы

Сообщество Overcoder
Наверх
Меню