title: Laravel: How to create combinations of product variants and store in database
body: <p>I have the following database structure, but I am struggling to understand how the relationships would work between each table using Laravel.</p>
  
  <p>Also, how would I be able to generate all of the Product Variant Values and Product Variants when updating a product? I don't want to have to do multiple single queries. Is this possible in Laravel?</p>
  
  <pre><code>PRODUCTS - hasMany Options
  ========
  product_id product_name
  ---------- ------------
  1          Widget 1
  2          Widget 2
  3          Widget 3
  
  OPTIONS - hasMany Option Values
  =======
  option_id option_name
  --------- -----------
  1         Size SL
  2         Color
  3         Size SM
  4         Class
  5         Size ML
  
  OPTION_VALUES - belongsTo Options
  =============
  option_id value_id value_name
  --------- -------- ------------
  1         1        Small        (Size SL)
  1         2        Large        (Size SL)
  2         1        White        (Color)
  2         2        Black        (Color)
  3         1        Small        (Size SM)
  3         2        Medium       (Size SM)
  4         1        Amateur      (Class)
  4         2        Professional (Class)
  5         1        Medium       (Size ML)
  5         2        Large        (Size ML)
  
  PRODUCT_OPTIONS - belongsToMany Products and Product Options
  ===============
  product_id option_id
  ---------- ---------
  1          1         (Widget 1; Size SL)
  1          2         (Widget 1; Color)
  2          3         (Widget 2; Size SM)
  3          4         (Widget 3; Class)
  3          5         (Widget 4; Size ML)
  
  PRODUCT_VARIANTS - ???
  ================
  product_id variant_id sku_id
  ---------- ---------- ------
  1          1          W1SSCW (Widget 1)
  1          2          W1SSCB (Widget 1)
  1          3          W1SLCW (Widget 1)
  1          4          W1SLCB (Widget 1)
  2          1          W2SS   (Widget 2)
  2          2          W2SM   (Widget 2)
  3          1          W3CASM (Widget 3)
  3          2          W3CASL (Widget 3)
  3          3          W3CPSM (Widget 3)
  3          4          W3CPSL (Widget 3)
  
  VARIANT_VALUES - ???
  ==============
  product_id variant_id option_id value_id
  ---------- ---------- --------- --------
  1          1          1         1        (W1SSCW; Size SL; Small)
  1          1          2         1        (W1SSCW; Color; White)
  1          2          1         1        (W1SSCB; Size SL; Small)
  1          2          2         2        (W1SSCB; Color; Black)
  1          3          1         2        (W1SLCW; Size SL; Large)
  1          3          2         1        (W1SLCW; Color; White)
  1          4          1         2        (W1SLCB; Size SL; Large)
  1          4          2         2        (W1SLCB; Color; Black)
  2          1          3         1        (W2SS; Size SM; Small)
  2          2          3         2        (W2SM; Size SM; Medium)
  3          1          4         1        (W3CASM; Class; Amateur)
  3          1          5         1        (W3CASM; Size ML; Medium)
  3          2          4         1        (W3CASL; Class; Amateur)
  3          2          5         2        (W3CASL; Size ML; Large)
  3          3          4         2        (W3CPSM; Class; Professional)
  3          3          5         1        (W3CPSM; Size ML; Medium)
  3          4          4         2        (W3CPSL; Class; Professional)
  3          4          5         2        (W3CPSL; Size ML; Large)
  </code></pre>
  
  <p>I have written next to each table name the relationship I think it has, the ones I don't fully understand have <code>???</code></p>