Laravel: поиск связанных данных - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть модели: студент, репетитор, страна.

Основная модель Студент с кодом:

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();

Над кодом найдены связанные наборы данных, как и ожидалось.

Ты, я не уверен, что для оценки этого.

1 Ответ

0 голосов
/ 01 сентября 2018

Вы можете искать данные в связанных таблицах, используя функцию whereHas () , например ::

$student->studentFavouriteTutors()
  ->whereHas('tutorAddresses', function($query) use ($searchPhraze) {
    $query->where('city', 'like', '%' . $searchPhraze . '%');
  })->get();

Это даст вам все любимые репетиторы студентов, у которых есть адрес, где в колонке city содержится данная фраза.

...