1. "Fabrik 4" helpers needed!

    You are invited to join other community members active in coding, maintaining and improving Fabrik. Please visit https://fabrik.help for more information!
    Dismiss Notice

Inverse DatabaseJoin Element

Discussion in 'Standard Support' started by marcelf, Aug 24, 2018.

  1. marcelf

    marcelf Member

    Level: Community
    Hi all,

    I have the following question:

    I created 2 lists: Artists and Bands. In the Artists, I created Band element using databasejoin plugin (multiselect dropdown).

    In the Bands list I want to create Artists element. Now I have a problem: If I do this, fabrik will create 2 different NN tables for the same relation. And this obligates the user makes the same relation twice. If the user associates a band in the artists form, it doesn't appear in the band details page and vice versa.

    What I want: I want to use the same NN table for both, so I'm thinking about to develop the Inverse DatabaseJoin element. In the administrator>new element>inverse databasejoin plugin, you set the databasejoin element already created in the other group and If the user does a relation in any of two forms, it appears on both. OR... maybe already has another way to do this?


    ps: In OWL (from the semantic web) it is called inverseOf property
  2. cheesegrits

    cheesegrits Support Gopher Staff Member

    Level: Community
    Personally I would do this with List joins rather than a join element.

    Create a bands_artists List (which will be a many-to-many junction table) from the standard 'default' list type...

    id (internalid element, ie. created by default when you create the list)
    date_time (you can delete or unpublish this if you want)
    band_id (create a 'field' element, set to type INTEGER)
    artist_id (create a 'field' element, set to type INTEGER)

    Then in the Bands list, create a join from band.id to bands_artists.band_id, and in the Artists list as artists.id to bands_artists.artist_id. In both cases, set the join to Repeat.

    You'll then have a new group on each form, for the repeat. In the Bands copy, you can hide the 'band_id' element, and change the artist_id element type to be a 'databasejoin' (as a single select dropdown) to artists (value 'id', label 'name'), and in the Artists copy hide the artist_id, and set band_id to be a join to bands.

    That should then be naturally be an insverseOf. If you add an artist to a band, if you then view that artists form, the band will be listed.

    You can set the 'layout' of the repeat groups to be 'table', which would probably be a better visual look.

    It does mean that to add an artist to a band (or vice versa), you have to "Add" a new group, and then select the artist from the join dropdown, rather than just selecting them all from a single multiselect.

    But on the other hand, it means you can do "other stuff" in the junction table, for example using an autofill plugin, or maybe CDD's, to fill other fields in the junction table (like 'instrument'), taken from the artists (or maybe an artists_instrument) table. Etc.

    -- hugh

Share This Page