Laravel Eloquent:通过自身属性和关系属性以及远关系属性来过滤模型

时间:2015-09-20 11:42:27

标签: search laravel-4 orm model eloquent

我有一个简单的,我认为经常出现的情况,但我无法在整个互联网上找到任何解决方案。

有四种相关模型:地点,位置,省份和国家。其中每个都有几个属性(如名称)。

国家: 在Country模型中,我想查找名称与给定搜索字符串匹配的所有国家/地区,这非常简单:

class Country extends \Eloquent
{
    public function provinces()
    {
        return $this->hasMany('Province');
    }

    [...]

    public function scopeSearch($query, $string)
    {
        if (isset($string) and !is_null($string)) {

            $terms = explode(' ', $string); // Array of searchstrings

            foreach ($terms as $term) {
                $query = $query->orWhere('name', 'like', '%' . $term . '%');
            }
        }

        return $query;
    }
}

省: 在省份模型中,我想查找所有名称与给定搜索字符串匹配的省份(如国家模型中),还要查找省份,其中国家/地区名称与此搜索字符串匹配。这也不是很困难:

class Province extends \Eloquent
{
    public function country()
    {
        return $this->belongsTo('Country');
    }

    public function locations()
    {
        return $this->hasMany('Location');
    }

    [...]

    public function scopeSearch($query, $string)
    {
        if (isset($string) and !is_null($string)) {

            $terms = explode(' ', $string); // Array of searchstrings

            foreach ($terms as $term) {
                $query = $query->orWhereHas('country', function ($query) use ($term) {
                    $query->where('name', 'like', '%' . $term . '%');
                });

                $query = $query->orWhere('name', 'like', '%' . $term . '%');
            }
        }

        return $query;
    }
}

位置: 现在它变得棘手:在Location模型中,我想找到名称与给定搜索字符串匹配的所有位置,还有省份,省名称与此搜索字符串匹配,而且 - 这是棘手的部分 - 国家名称与给定搜索字符串。目前我不知道如何实现这一目标。

class Location extends \Eloquent
{
    public function province()
    {
        return $this->belongsTo('Province');
    }

    public function places()
    {
        return $this->hasMany('Place');
    }

    [...]

    public function scopeSearch($query, $string)
    {
        if (isset($string) and !is_null($string)) {

            $terms = explode(' ', $string); // Array of searchstrings

            foreach ($terms as $term) {
                $query = $query->orWhereHas('province', function ($query) use ($term) {
                    $query->where('name', 'like', '%' . $term . '%');
                });

                $query = $query->orWhere('name', 'like', '%' . $term . '%');
            }
        }

        return $query;
    }
}

地点: 同样在这里:在Place模型中,我想找到名称与给定搜索字符串匹配的所有地方,以及位置,位置名称与此搜索字符串匹配的位置以及省名称与给定搜索字符串匹配的位置,当然还有国家/地区名称匹配搜索字符串。还在这里:目前我不知道如何实现这一目标。

class Place extends \Eloquent
{
    public function location()
    {
        return $this->belongsTo('Location');
    }

    [...]

    public function scopeSearch($query, $string)
    {
        if (isset($string) and !is_null($string)) {

            $terms = explode(' ', $string); // Array of searchstrings

            foreach ($terms as $term) {
                $query = $query->orWhereHas('location', function ($query) use ($term) {
                    $query->where('name', 'like', '%' . $term . '%');
                });

                $query = $query->orWhere('name', 'like', '%' . $term . '%');
            }
        }

        return $query;
    }
}

那么,有人知道如何解决这个问题吗?有(简单)方法吗?有人知道Laravel 4插件可能对我有帮助吗?或者我完全是错误的方式,并且必须在控制器中执行所有这些操作?

谢谢!

0 个答案:

没有答案