A page has multiple elements and they are linked using the page_to_elements table. Each element has multiple element_fields and are linked using the element_to_element_fields. Each element_field has a type and are linked using the element_to_element_fields table. The values of each element_field within the element has a value (eitehr in value_char, value_text or value_num) that is stored in the element_values table. Below is how the database structure is: pages: id|name elements: id|name element_fields_types (sql_type can be char, text or num): id|name|sql_type element_fields (names can be title, intro, content, link, number, etc etc): id:element_field_type_id|name element_to_element_fields: id|element_id|element_field_id page_to_elements: id|page_id|element_id element_values: id|page_id|element_id|page_to_element_id|element_field_id|value_char|value_text|value_num What I am looking for is a good hasManyToMany solution to get all values when I request a page id. I now have multiple loops and array creations to get a structure like this (where the values are from the correct column name based on what was set in the element_fields): $page = array( 'elements' => array( [0] => array( 'element_name_here' => array( 'fields' => array( [0] => array( 'field_name_here' => 'Field value', 'field_name_here' => 'Field value', 'field_name_here' => 'Field value', 'field_name_here' => 'Field value' ), [1] => array( 'field_name_here' => 'Field value', 'field_name_here' => 'Field value', 'field_name_here' => 'Field value', 'field_name_here' => 'Field value' ), [2] => array( 'field_name_here' => 'Field value', 'field_name_here' => 'Field value', 'field_name_here' => 'Field value', 'field_name_here' => 'Field value' ), ) ) ), [1] => array( 'element_name_here' => array( 'fields' => array( [0] => array( 'field_name_here' => 'Field value', 'field_name_here' => 'Field value', 'field_name_here' => 'Field value', 'field_name_here' => 'Field value' ), [1] => array( 'field_name_here' => 'Field value', 'field_name_here' => 'Field value', 'field_name_here' => 'Field value', 'field_name_here' => 'Field value' ), [2] => array( 'field_name_here' => 'Field value', 'field_name_here' => 'Field value', 'field_name_here' => 'Field value', 'field_name_here' => 'Field value' ), ) ) ), ) ); And we will get something like $page = Page::find($id); print_r($page->getValues->toArray());