Laravel Scope搜索相关模型

时间:2018-07-07 08:53:08

标签: laravel laravel-5 eloquent

我有一个旅行模型,该模型引用了国家/地区模型。我正在尝试通过laravel的 scopeSearch 来获取与国家/地区名称相匹配的旅行历史记录列表。

以下是我到目前为止尝试过的内容:

>>> for order in root.iter('{http://publicapi.ekmpowershop.com/}Order'):
...     out = {}
...     for child in order:
...         if child.tag in tags:
...             out[child.tag[child.tag.index('}')+1:]] = child.text
...     print(out)
... 
{'OrderID': '100', 'OrderNumber': '102/040718/67'}

但是我得到的结果是空的。下面是引用国家模型的方法

public function scopeSearch($query, $search='')
{
        return $query->orderBy("arrival_date", "desc")
                    ->with(['country' => function ($query) use($search){
                        $query->WhereRaw("name LIKE ? ", '%' . $search . '%');
                    }])
                    ->WhereRaw("destination LIKE ? ", '%' . $search . '%')
                    ->orWhereRaw("city LIKE ? ", '%' . $search . '%')
                    ->whereNull("delete_date");
}

编辑:按照建议使用public function country() { return $this->belongsTo(Country::class); } 后,我将获得以下查询

toSql()

进一步编辑:感谢MarcinNabiałek的回答,我自己解决了这个问题。我将在下面发布代码,以防任何试图解决类似问题的用户

select * from `travel_schedule` where `travel_schedule`.`user_id` = ? and `travel_schedule`.`user_id` is not null and (destination LIKE ?  or city LIKE ?  and `delete_date` is null) order by `arrival_date` desc

1 个答案:

答案 0 :(得分:0)

这里的问题是您没有在这里搜索任何内容,而是在这里使用with,我相信您想使用whereHas

您的范围应如下所示:

public function scopeSearch($query, $search='')
{
    return $query->orderBy("arrival_date", "desc")
                ->whereHas('country', function ($query) use($search){
                    $query->where('name', 'LIKE' '%' . $search . '%');
                })
                ->whereNull("delete_date");
}

如果您想以其他方式对结果进行排序,我也将避免在这种范围内使用orderBy