I would have a table for Offers and a table for Review Types. Offers can have 1 or Many Review Types, and Review Types can have 1 or Many Offers (so that repetition is cut down). That some types of reviews are optional doesn't need separating them out into another table.
From here I'd create a pivot to attach Review Types to Offers. I'm a little unsure how I'd then go on to attach Reviews to this. Either give the pivot an ID and attach Reviews to that (I feel like this is probably the bad way) or give the Reviews a composite key of Offer and Review Type (unsure if this is supported by Eloquent yet or planned to be). To be honest, I think the second solution is better, and then use a service and the query builder to retrieve the Reviews for an Offer.


