2016-12-12 2 views
1

У меня есть Группа модель, где определены несколько отношений. Теперь я хочу просматривать группы по различным параметрам. Например, группа может иметь «интерес», который определяется как отношение в модели. Поэтому, если я выберу конкретный интерес, он должен показать все связанные группы.Как проверить правильность связи между моделями в laravel

public function browse(Request $request) 
    { 
     // $browseField is the field we are browsing against, $fieldId is the primary key for that relationship 
     // I want $browseField to be a valid relationship 
     $browseField = $request->browseField; 
     $fieldId = $request->fieldId; 

     $groups = \App\Group::whereHas($browseField, function($q) use($fieldId) { 
      $q->where('id', $fieldId); 
     })->get(); 

     $data = ['groups' => $groups]; 
     return $this->sendResponseData($data); 
    } 

Теперь я не хотел определять один и тот же процесс для каждой связи и взял имя отношения в качестве параметра.

Теперь это работает, если исправить $browseField. Но как проверить, действительно ли связь существует. И должен ли я делать фильтрацию таким образом или есть лучший способ?

Редактировать

Чтобы лучше объяснить, что я хочу сделать, группы имеют «Возрастная группа», «Этнос» и т.д. Если я хочу, чтобы просмотреть по возрастным группам, я бы поставить $browseField = ageGroup (ageGroup является отношения), $browseField = ethnicity для просмотра по этническому признаку. Теперь, если кто-то решит поставить $browseField = asfasf, который недействителен, код выдает ошибку. Это то, что я хочу, чтобы предотвратить

+0

Из того, что это звучит как, вы бы лучше использовать 'Интерес :: belongsToMany («Group»);' в вашей модели Интересы – scottevans93

+0

Если вы правильно выполняете MVC, вам никогда не нужно проверять соединение между классами моделей, вы явно предоставляете это. –

ответ

2

Вы можете использовать method_exists()

$group = new \App\Group(); 

if (method_exists($group, $browseField)) { 
    $groups = $group->whereHas($browseField, function($q) use($fieldId) { 
     $q->where('id', $fieldId); 
    })->get(); 
} 
Смежные вопросы