Множество много_много отношения в 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, например, и да създам ред в свързаната таблица с ID на TableA и ID на TableB, трябва ли да използвам необработен SQL със SilverStripe 2.4?   -  person MillyMonster    schedule 22.08.2012


Отговори (1)


за управление на много_много отношения в SilverStripe можете да използвате следното поле:

ss2.4: ManyManyComplexTableFieldили ManyManyDataObjectManager, и двете предоставят списък на всички записи от този тип и ви позволяват да изберете връзката с квадратчета за отметка

ss3.0: GridField, но може да се наложи сам да добавите квадратчетата за отметка, не съм сигурен

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


Не съм сигурен какво имате предвид с „итерация през всеки екземпляр на TableA“ в коментара, ако просто искате да завъртите всички TableAs, които са присвоени на един запис на TableB, тогава можете да направите:

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

Но ако наистина искате да направите нещо на ВСИЧКИ записи на TableA, тогава можете да направите:

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