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();
这将为您提供所有学生最喜欢的导师,他们的地址 城市 列包含给定的短语。
我有模型:学生、导师、国家。
主要模型是 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();
这将为您提供所有学生最喜欢的导师,他们的地址 城市 列包含给定的短语。