我有一个旅行模型,该模型引用了国家/地区模型。我正在尝试通过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
答案 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