Проблема с отношениями many_many с Silverstripe Fluent - PullRequest
1 голос
/ 24 октября 2019

Мы работаем над проектом Silverstripe, используя Свободно для отображения нескольких переводов / локалей.

Мы хотим настроить некоторые из наших объектов данных, чтобы записи можно было переключать, чтобы показывать только в некоторыхСвободные места. Идея состоит в том, чтобы иметь поле флажка на объекте данных, где пользователи могут выбирать, в каком языковом стандарте они хотят, чтобы запись отображалась.

Вот пример объекта данных:

namespace Yard;

use SilverStripe\ORM\DataObject;
use TractorCow\Fluent\Model\Locale;

class Milkshake extends DataObject {
  private static $table_name = 'Milkshake';

  private static $db = [
    'Title' => 'Varchar(255)'
  ]

  private static $belongs_many_many = [
    'ShowInLocale' => 'Locale'
  ];
}

затемнам нужно расширить класс Locale:

namespace AppExtensions;

use SilverStripe\ORM\DataExtension;

class LocaleExtension extends DataExtension
{
    private static $many_many = [
        'Milkshakes' => 'Yard\Milkshake'
    ];
}

и применить это расширение через YML:

TractorCow\Fluent\Model\Locale:
  extensions:
    - 'AppExtensions\LocaleExtension'

Пока все хорошо - но когда я пытаюсь просмотреть «Молочный коктейль» в админкеЯ получаю это сообщение об ошибке:

[Emergency] Uncaught LogicException: отношение_many_many Yard \ Milkshake.ShowInLocale указывает на Locale без сопоставления many_many

Насколько я могу сказать, ядобавили соответствующие отношения many_many: записи базы данных созданы.

Любые идеи о том, как мне это исправить, приветствуются.

1 Ответ

2 голосов
/ 24 октября 2019

Я использовал функциональность $many_many through , чтобы установить соединение через отдельный объект данных.

Объект Milkshake изменился с $belongs_many_many (что было неверно) на $many_many ссквозное отношение объекта:

class Milkshake extends DataObject {

  private static $many_many = [
    'ShowInLocale' => [
      'through' => LocaleMilkshake::class,
      'from' => 'Milkshake',
      'to' => 'Locale'
     ]
  ];

Вот как я создал флажки:

$fields = parent::getCMSFields();
$showInLocaleField = CheckboxSetField::create(
  'ShowInLocale',
  'Show in these Locales',
   Locale::get()->map('ID','Title');
 );
 $fields->addFieldToTab('Root.Main', $showInLocaleField);

И определил отдельный объект данных:

class LocaleMilkshake extends DataObject
{
  private static $table_name = 'LocaleMilkshake';
  private static $has_one = [
    'Milkshake' => 'Yard\Milkshake',
    'Locale' => 'TractorCow\Fluent\Model\Locale'
  ];
}

Иизменил отношение Locale на $belongs_many_many:

class LocaleExtension extends DataExtension
{
    private static $belongs_many_many = [
        'Milkshakes' => 'Yard\Milkshake'
    ];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...