Laravel Eloquent ORM 过滤关系

Laravel Eloquent ORM filtering with relationship

我正在做一个过滤器,有一个问题我无法解决。过滤器使用关系,它是完美的。但是当我对 table 中不存在的属性进行筛选时,它不起作用。因为问题太复杂我给你一个示例代码:

<?php

class School extends Eloquent {

    protected $table = 'schools';

    public function city(){
        return $this->belongsTo('City');
    }

    public function municipality(){
        return $this->belongsTo('Municipality');
    }

    public function listSchoolsEndUser()
    {
        $schools_data = new School;

        if ( Input::has('district') ) {
            $schools_data =  $schools_data->whereHas('city', function($q){
                $q->where('district_id', '=', Input::get('district'));
            });
        }

        if ( Input::has('municipality') ) {
            $schools_data =  $schools_data->whereHas('city', function($q){
                $q->where('municipality_id', '=', Input::get('municipality'));
            });
        }

        if ( Input::has('city') ) {
            $schools_data = $schools_data->where('city_id', '=', Input::get('city'));
        }

        $schools_data = $schools_data->paginate(12);

        return $schools_data;
    }
}

错误是:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'district_id' in 'where clause' (SQL: select count(*) as aggregate from `schools` where (`specialties` like %"5"%) and (select count(*) from `cities` where `schools`.`city_id` = `cities`.`id` and `district_id` = 5) >= 1)

示例 table 结构为:

Schools table:
|---------------|
|id|name|city_id|
|---------------|

Cities table:
|-----------------------|
|id|name|municipality_id|
|-----------------------|

Municipalities table:
|-------------------|
|id|name|district_id|
|-------------------|

Districts table:
|-------|
|id|name|
|-------|

因为 district_id 是两个关系,所以您需要使用点语法来定位嵌套关系:

if ( Input::has('district') ) {
    $schools_data =  $schools_data->whereHas('city.municipality', function($q){
        $q->where('district_id', '=', Input::get('district'));
    });
}

(假设您的 City 模型中有一个 municipality() 关系)