Laravel-按不同的关系过滤记录

时间:2018-07-06 06:29:26

标签: laravel eloquent laravel-query-builder

现在我具有以下模型结构,

Country -> State -> City -> Student

Student模型包括first_namelast_name

因此,我希望通过提供学生的名字来过滤国家/地区。就像如果我给John一样,那么我想要一个拥有名字为John的学生的国家/地区列表。

我正在尝试类似的事情,

我在Students()模型中添加了一个名为Country的方法,并从该方法返回Student实例。但是现在,我坚持寻找如何过滤国家/地区。

感谢您的期待。

3 个答案:

答案 0 :(得分:1)

在学生模型中创建以下内容:

public function city()
    {
        return $this->belongsTo(City::class,'city_id', 'id');
    }

,然后在“城市模型”中创建以下内容:

public function state()
    {
        return $this->belongsTo(State::class,'state_id', 'id');
    }

最后进入状态模型:

public function country()
    {
        return $this->belongsTo(Country::class,'country_id', 'id');
    }

例如,如果您在控制器中做了类似的事情:

$students = Student::where('name', 'John')->get();

在视图中:

@foreach($students as $student)
$student->city->state->country->country_name;
@endforeach

您可以这样访问。

答案 1 :(得分:0)

我最近遇到了一个类似的问题,我自己也提出了以下解决方案。也许有更简单的方法,但是我想这会带您前进。

首先,如您所述,我们用dim_size(int index) == first_name查询所有用户,然后将查询限制为仅输出ID。

John

然后我们将其与国家模型中的$users = User::where('first_name', 'John')->get()->pluck('id'); 的结果进行交叉比较。因为我不知道要查询想要的国家/地区,所以我仅以荷兰为例-这就是我的住所。

Students()

要执行此操作,必须确保在模型的$users = Country::where('name', 'the Netherlands')->students()->whereIn('id', $users)->get(); 函数中,Students()不存在。

最终“结果”:

get()

答案 2 :(得分:0)

如果您已正确设置了模型和关系,则需要使用with with函数调用它们

$students = Student::where('name','John')->with('city.state.country')->get();

遍历$students

@foreach($students as $student)
     {{ $student->city->state->country }}
@endif