У меня есть модели: студент, репетитор, страна.
Основная модель Студент с кодом:
public function studentTutors()
{
return $this->morphedByMany(Tutor::class, 'studentable')
->with('tutorAddresses');
}
Тогда отношения.
Репетитор :
public function tutorAddresses()
{
return $this->hasMany(TutorAddress::class, 'tutor_id', 'id')
->with('tutorCountry');
}
TutorAddress
public function tutorCountry()
{
return $this->hasOne(Country::class, 'country_id', 'country_id')
->where('user_lang', 'en');
}
Как мне его использовать :
$paginator = $student->studentFavouriteTutors()
->getQuery() //for paginate
->where(function ($query) use ($searchPhraze) {
if (strlen(trim($searchPhraze))) {
return $query
->where('username', 'like', '%' . $searchPhraze . '%')
->orWhere('firstname', 'like', '%' . $searchPhraze . '%')
->orWhere('lastname', 'like', '%' . $searchPhraze . '%');
}
})
->paginate($pages, $columns, $pageName, $page);
Вопрос :
Я ищу в таблице преподавателей (Tutor) имя пользователя / фамилию.
Есть ли способ поиска названия страны из таблицы стран (Страна: tutorCountry)? Допустим, в таблице есть столбец name с названиями стран.
Если да, как должен выглядеть код $ paginator , чтобы получить данные из таблицы стран?
Тот же вопрос касается отношения tutorAddresses . Допустим, в таблице есть столбец city с названиями городов.
Возможно ли это?
Теперь я не использую отношения для поиска, а просто делаю объединения.
BTW : я пробовал отношение hasManyThrough, но, похоже, оно не передает данные из этой сквозной таблицы, поэтому у меня это не сработает. Кроме того, мои «сквозные» отношения слишком глубоки для этого (если я не понимаю что-то, что касается этого отношения).
<ч />
EDIT
Ответ от jedrzej.kurylo идеально!
Я просто хочу добавить ко всем этим, кто ищет способ поиска в отношении отношения, как в моем случае:
studentTutor / tutorAddresses / tutorCountry
... где внутри модели Student я также хочу найти название страны внутри модели Country, которая глубже в цепочке отношений и не связана напрямую с Tutor, но связана с TutorAddress, который связан с Tutor.
Это просто вопрос вложенности запросов:
$searchPhraze = 'France';
$res = $student->studentFavouriteTutors()
//first relation level
->whereHas('tutorAddresses', function($query) use ($searchPhraze) {
//deeper relation
$query->whereHas('tutorCountry', function($query) use ($searchPhraze) {
$query->where('country', 'like', '%' . $searchPhraze . '%');
});
})->get();
Или вы можете даже объединить поиски родительских и дочерних отношений:
$searchPhraze = 'Hodkiewiczville';
$res = $student->studentFavouriteTutors()
//first relation level
->whereHas('tutorAddresses', function($query) use ($searchPhraze) {
$query
//first level relation search
->where('city', 'like', '%' . $searchPhraze . '%')
//deeper relation
->orWhereHas('tutorCountry', function($query) use ($searchPhraze) {
$query->where('country_label', 'like', '%' . $searchPhraze . '%'));
});
})->get();
Над кодом найдены связанные наборы данных, как и ожидалось.
Ты, я не уверен, что для оценки этого.