Laravel: 搜索相关资料

Laravel: searching related data

我有模型:学生、导师、国家。

主要模型是 Student,代码:

public function studentTutors()
{
    return $this->morphedByMany(Tutor::class, 'studentable')
                ->with('tutorAddresses');
}

然后关系。

导师:

public function tutorAddresses()
{
   return $this->hasMany(TutorAddress::class, 'tutor_id', 'id')
               ->with('tutorCountry');
}   

导师地址:

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

问题

我在导师 table(导师)中搜索 user/first/last 个名字。

有没有办法从国家table(国家:tutorCountry)中搜索国家名称?比方说,table 有带有国家名称的“name”列。

如果是,$paginator 代码应该怎样才能从国家 table 获取数据?

同样的问题也适用于关系 tutorAddresses。比方说,table 有带有城市名称的“city”列。

这可能吗?

现在,我不使用关系进行搜索,只使用连接。

BTW:我试过 hasManyThrough 关系,但它似乎没有从 'through' table 传递数据,所以这行不通为了我。另外,我的 'through' 关系有点太深了(除非我对这种关系不了解)。


编辑:

jedrzej.kurylo 的回答很完美!

对于所有这些寻找一种在关系的关系内进行搜索的方法的人,我只想补充一点,就像我的情况一样:

studentTutors / tutorAddresses / tutorCountry

...在模型 Student 中,我还想在 Country 模型中查找国家名称,它在关系链中更深,与 Tutor 没有直接关系,但与 TutorAddress 相关,而 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();

以上代码按预期找到了相关数据集。

你,我不确定这个基准。

您可以使用whereHas()函数在相关表中搜索数据,例如:

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

这将为您提供所有学生最喜欢的导师,他们的地址 城市 列包含给定的短语。