我有模特:学生,老师,国家/地区。
主要模型为学生,代码为:
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();
上面的代码按预期找到了相关的数据集。
您,我不确定该基准。
答案 0 :(得分:1)
您可以使用 whereHas()函数在相关表中搜索数据,例如:
$student->studentFavouriteTutors()
->whereHas('tutorAddresses', function($query) use ($searchPhraze) {
$query->where('city', 'like', '%' . $searchPhraze . '%');
})->get();
这将为您提供所有学生最喜欢的导师,其地址在 city 列中包含给定短语。