I´m trying to import CSV data. One column of the CSV should be imported as a many_many relation. The CSVBulkLoader can manage relationCallbacks on a has_one relation but what about many_many? Can anyone provide a code example or good hint?
We've moved the forum!
Please use forum.silverstripe.org for any new questions
(announcement).
The forum archive will stick around, but will be read only.
You can also use our Slack channel
or StackOverflow to ask for help.
Check out our community overview for more options to contribute.
Subscribe
I solved my issue but this isn´t the elegant way. I import my csv data with fgetcsv(). The value of the field that represents the many_many relation is converted to an array with explode(). The elements of this array get saved to the table that represents the many_many relation. I did this with
$sql = "INSERT INTO `database`.`Relation_table` (`column1`, `column2`) VALUES ('$studioID', '$contract->ID');";
DB::query($sql);
This is no more ORM, that´s why I call my way less elegant, but it works.
DataObject::getManyManyFilter might be the method to do this the right way but nor did I understand it yet neither is it documented.
I'm just working on a subclass of CSVBulkLoader, called MemberCsvBulkLoader. See first cut: http://pastie.org/723161
It can take multiple group codes inside a new "Groups" column in the CSV data for each member row, and resolves them automatically into manymany relationships.
The main issue here is that for each relationship, you'd probably want some unique criteria other than a primary key to make the CSV file independent of your specific database keys. In the case of $member->Groups() relations, thats already solved for us with the "Code" property.
This class will most likely find its way into SilverStripe trunk soon, together with a new "Import" tab in the admin/security section :)