Laravel:搜索相关数据

时间:2018-09-01 04:39:27

标签: laravel-5 relationship laravel-5.6

我有模特:学生,老师,国家/地区。

主要模型为学生,代码为:

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)中搜索国家/地区名称?可以说,表格的“ 名称”列带有国家/地区名称。

如果可以, $ paginator 代码应如何从国家表中获取数据?

关系 tutorAddresses 也有相同的问题。可以说,表格的“ city ”列带有城市名称。

这可能吗?

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

顺便说一句:我尝试过hasManyThrough关系,但是它似乎没有传递来自“通过”表的数据,因此这对我来说不起作用。另外,我的“直通”关系对此太深了(除非我不了解这种关系)。


编辑

jedrzej.kurylo的答案非常完美!

对于所有这些,我只想添加一个寻找关系内关系的方式的人,例如我的情况:

studentTutors / tutorAddresses / tutorCountry

...在模型学生中的哪个位置,我还想在国家模型中查找国家名称,该国家名称在关系链中更深,与Tutor不直接相关,而与与Tutor相关的TutorAddress相关。 / p>

这只是嵌套查询的问题:

$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 :(得分:1)

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

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

这将为您提供所有学生最喜欢的导师,其地址在 city 列中包含给定短语。