Множественные отношения many_many в Silverstripe

Мне просто интересно, возможно ли иметь несколько отношений many_many в одном классе. Например, у меня есть таблица A, таблица B и таблица C. Мне нужна связь many_many между таблицей A и таблицей B и другая связь many_many между таблицей A и таблицей C. Я пробовал это, но это не добавляет идентификаторы в таблицы, которые он создает. Я поискал и нашел этот http://www.balbuss.com/multiple-many-many-s-of-the-same-class/ и не уверен, возможно ли это сейчас.

Любая помощь очень ценится.

У меня была мысль использовать onAfterWrite для заполнения связанной таблицы, но нужно ли мне это делать?

class Table B extends DateObject {
static $belongs_many_many = array (
    'TableAs' => 'TableA'
);
}

class Table C extends DateObject {
static $belongs_many_many = array (
    'TableAs' => 'TableA'
);
}

class Table A extends Page {
    static $many_many = array (
    'TableB' => 'TableB',
    'TableC' => 'TableC'
);
}

person MillyMonster    schedule 22.08.2012    source источник
comment
нет, onAfterWrite не звучит как правильный способ исправить это. не могли бы вы добавить свой текущий код, пожалуйста?   -  person Zauberfisch    schedule 22.08.2012
comment
Спасибо за ответ на этот @Zauberfisch. Я добавил приведенный выше код, который относится к отношению many_many.   -  person MillyMonster    schedule 22.08.2012
comment
отношения, безусловно, возможны таким образом, у меня самого было много случаев, когда мои отношения выглядели точно так же, как ваши. То есть вы говорите, что отношения не сохраняются? Не могли бы вы также опубликовать код того, как вы сохраняете отношения? что вы используете для управления отношениями?   -  person Zauberfisch    schedule 22.08.2012
comment
Ах, вот где возникает мое замешательство. Я новичок в этой области SilverStripe, но разве это не должно работать аналогично отношению has_one? Я предположил (вероятно, наивно), что идентификаторы будут автоматически добавлены в таблицы, например, после создания новой таблицы B. Разве это не так?   -  person MillyMonster    schedule 22.08.2012
comment
ну да, отношения автоматически сохраняются, но только если вы используете для этого правильный инструмент. Например, ManyManyComplexTableField или ManyManyDataObjectManager в ss2 или GridField в ss3 сохранят отношение   -  person Zauberfisch    schedule 22.08.2012
comment
Понимаю. Тогда мне нужен ManyManyDataObjectManager? Я использовал старый добрый DataObjectManager. Что объясняет его. Если вы опубликуете это как ответ, я отдам вам должное. Спасибо. Еще одна вещь, если бы я хотел перебрать каждый экземпляр TableA, например, и создать строку в связанной таблице с идентификатором TableA и идентификатором TableB, нужно ли мне использовать необработанный SQL с SilverStripe 2.4?   -  person MillyMonster    schedule 22.08.2012


Ответы (1)


для управления отношениями many_many в SilverStripe вы можете использовать следующее поле:

ss2.4: ManyManyComplexTableFieldили ManyManyDataObjectManager, оба предоставляют список всех записей этого типа и позволяют выбрать отношение с помощью флажков

ss3.0: GridField, но, возможно, вам придется добавить флажки самостоятельно, не уверен

кроме того, как в 2.4, так и в 3.0 есть некоторые раскрывающиеся поля и другие поля, которые также поддерживают отношения many_many (например, TreeMultiselectField)


Я не уверен, что вы имеете в виду под «перебирать каждый экземпляр TableA» в комментарии, если вы просто хотите зациклить все TableAs, назначенные одной записи TableB, вы можете сделать:

foreach ($tableBrecord->TableAs($filter = "", $sort = "", $join = "", $limit = "") as $tableArecord) {
   // do something with $tableArecord
}

Но если вы действительно хотите что-то сделать со ВСЕМИ записями таблицы A, вы можете сделать это:

foreach(DataObject::get('TableA', $filter = "", $sort = "", $join = "", $limit = "") as $tableArecord) {
   // do something with $tableArecord
}

если у вас много записей TableA, это может быть немного медленным, поэтому вы также можете выполнить собственный запрос, например

 DB::query('UPDATE TableA SET ...');
person Zauberfisch    schedule 22.08.2012
comment
Извините, я не выразился яснее @Zauberfisch. Второй вариант, кажется, тот, который я хочу. Я пытался что-то вроде этого. $Tables = DataObject::get(TableA), так как эта строка работала раньше. Я хочу добавить идентификатор из каждого магазина в связанную таблицу вместе с идентификатором вновь созданной таблицы B. - person MillyMonster; 22.08.2012
comment
ты понял это? Я не уверен, является ли ваш комментарий утверждением или вопросом :) - person Zauberfisch; 23.08.2012
comment
Нет, то, что я пробовал, не сработало. Прошу прощения за этот растянутый вопрос. Я продолжу. Спасибо за вашу помощь и ваше терпение. :) - person MillyMonster; 23.08.2012
comment
Если вам все еще нужна помощь, пожалуйста, задайте новый вопрос и отправьте ему код, я все еще не уверен, что вы на самом деле хотите сделать и что вместо этого произойдет. - person Zauberfisch; 25.08.2012