Laravel:搜索相关数据

Posted

技术标签:

【中文标题】Laravel:搜索相关数据【英文标题】:Laravel: searching related data 【发布时间】:2019-02-07 01:04:55 【问题描述】:

我有模特:学生、导师、国家/地区。

主模型是学生,代码:

公共功能 studentTutors() return $this->morphedByMany(Tutor::class, 'studentable') ->with('tutorAddresses');

然后是关系。

导师

公共功能导师地址() 返回 $this->hasMany(TutorAddress::class, 'tutor_id', 'id') ->with('tutorCountry');

导师地址

公共功能导师国家() return $this->hasOne(Country::class, 'country_id', 'country_id') ->where('user_lang', 'en');

如何使用它

$paginator = $student->studentFavouriteTutors() ->getQuery() //用于分页 ->where(函数 ($query) 使用 ($searchPhraze) 如果 (strlen(trim($searchPhraze))) 返回$查询 ->where('username', 'like', '%' . $searchPhraze . '%') ->orWhere('firstname', 'like', '%' . $searchPhraze . '%') ->orWhere('lastname', 'like', '%' . $searchPhraze . '%'); ) ->分页($pages,$columns,$pageName,$page);

问题

我正在导师表 (Tutor) 中搜索用户/名字/姓氏。

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

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

同样的问题也适用于关系 tutorAddresses。可以说,表格有“city”列,其中包含城市名称。

这可能吗?

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

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


编辑

jedrzej.kurylo 的回答非常完美!

我只想添加,对于所有这些,他们正在寻找一种在关系的关系中搜索的方法,就像我的例子一样:

studentTutors/tutorAddresses/tutorCountry

...在模型Student中,我还想在Country模型中查找国家名称,它在关系链中更深,与Tutor没有直接关系,而是与TutorAddress相关,与Tutor有关。

这只是嵌套查询的问题:

$searchPhraze = '法国'; $res = $student->studentFavouriteTutors() //第一个关系级别 ->whereHas('tutorAddresses', function($query) use ($searchPhraze) //更深层次的关系 $query->whereHas('tutorCountry', function($query) use ($searchPhraze) $query->where('country', 'like', '%' . $searchPhraze . '%'); ); )->get();

或者你甚至可以结合搜索父子关系:

$searchPhraze = 'Hodkiewiczville'; $res = $student->studentFavouriteTutors() //第一个关系级别 ->whereHas('tutorAddresses', function($query) use ($searchPhraze) $查询 //一级关系搜索 ->where('city', 'like', '%' . $searchPhraze . '%') //更深层次的关系 ->orWhereHas('tutorCountry', function($query) use ($searchPhraze) $query->where('country_label', 'like', '%' . $searchPhraze . '%')); ); )->get();

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

你,我不确定这个基准。

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

完美。谢谢。

以上是关于Laravel:搜索相关数据的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 雄辩地搜索相关模型的字段

laravel软删除相关问题

尝试在 Laravel 中进行多输入搜索

Laravel 搜索关系

Laravel 数据表搜索嵌套关系

在laravel中的两个相关模型中过滤