Имя таблицы серебряной полоски не задано для класса

Я только изучаю SilverStripe, и у меня проблемы с уроками на сайте Silverstripe.

У меня есть этот класс:

namespace SilverStripe\Lessons;

use Page;

class ArticlePage extends Page
{
private static $can_be_root = false;
private static $db = [
'Date' => 'Date',
'Teaser' => 'Text',
'Author' => 'Varchar(255)',
];

//    public function getCMSFields(){
//        $fields = parent::getCMSFields();
//        $fields = addFieldToTab();
//        return $fields;
//    }

}

Теперь, когда я в / dev / build, я получаю этот отзыв на странице сборки:
введите описание изображения здесь

Итак, что я сделал дальше, так это закомментировал объявление массива $ db. Затем я получил этот отзыв от dev / build:

введите описание изображения здесь

Несколько вещей, в которых я не уверен. Красное примечание в первом выводе dev / build гласит, что вы должны определить имя_таблицы для всех моделей пространства имен. Это действительно не утверждает, что у меня есть table_name, которое не определено. Но следующая заметка под ним гласит, что table_name не установлено для класса SilverStripe \ Lessons \ ArticlePage. Так является ли определение table_name и «установка» table_name одним и тем же в контексте этих сообщений?

Кроме того, второй вывод указывает, что имя_таблицы было определено для SilverStripe \ Lessons \ ArticlePage
Я полагаю, тот факт, что к каждому имени таблицы добавлено «2», является результатом моих экспериментов. то есть, как только я увидел это поведение, я повторил эксперимент, чтобы попытаться воспроизвести поведение, и, следовательно, было создано и удалено больше таблиц, и поэтому их имена пришлось увеличивать.
Итак, почему ArticlePage table_name не установлен?
Кто-нибудь может мне помочь с этим вопросом?
Дэйв.

4

Решение

Сообщение означает, что вы должны настроить table_name для ваших страниц (и DataObjects), которые будут иметь свою собственную таблицу базы данных.

В вашем собственном коде это лучше всего достигается путем добавления частного статического свойства, например:

private static $table_name = 'ArticlePage';

Чтобы избежать столкновения имен, хорошей идеей является добавление префиксов имен таблиц к собственному названию компании или подобному. Но это действительно очень важно, если вы разрабатываете модуль или другой код, который будет работать в нескольких контекстах.

Альтернативой использованию статического свойства было бы определить его через YML. Так в вашем _config/mysite.yml вы бы положили:

SilverStripe\Lessons\ArticlePage:
table_name: ArticlePage

Замечания: Изменение с table_name был введен после SilverStripe 4.0.0 и, следовательно, урок, вероятно, не охватывал эту тему.

8

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]