laravel - Laravel 在哪里没有得到任何结果?
问题描述
我有一个餐厅模型,每个餐厅都有一个联系人模型,每个联系人都与一个城市模型相关:
餐厅.php:
public function contact()
{
return $this->hasOne('App\Contact','rest_id');
}
联系方式.php:
public function restaurant()
{
return $this->belongsTo('App\Restaurant','rest_id','id');
}
public function city()
{
return $this->belongsTo('App\City');
}
城市.php:
public function contacts()
{
return $this->hasMany('App\Contact');
}
现在,我想做的是搜索餐厅名称以及城市名称。
我的搜索控制器代码是这样的:
// the purpose of this condition is to keep the query empty until applying desired filters
$data = Restaurant::where('id', '=', '0');
$cityRest=$request->cityRest ;
if (!empty($cityRest)) {
$nameFilter = Restaurant::where('name', 'like', "%$cityRest%");
$contactFilter = Restaurant::whereHas('contact', function ($contact) use ($cityRest) {
$contact->where('address', 'like', "%$cityRest%");
$contact->whereHas('city', function ($city) use ($cityRest) {
$city->where('cityName', 'like', "%$cityRest%");
});
});
$data = $data->union($nameFilter);
$data = $data->union($contactFilter);
}
$data->get();
搜索餐厅名称时,结果正确返回,但搜索城市名称时没有返回任何内容,虽然有联系模型的餐厅有城市???
解决方案
您必须使用 aorWhereHas
而不是 a whereHas
。
whereHas
您正在搜索与您的输入相匹配的餐厅contact.address
。city.name
通过使用orWhereHas
您正在搜索与您的输入相匹配的contact.address
餐厅。city.name
AND 和 OR 运算符用于根据多个条件过滤记录:
- 如果由 AND 分隔的所有条件都为 TRUE,则 AND 运算符将显示一条记录。
- 如果由 OR 分隔的任何条件为 TRUE,则 OR 运算符将显示一条记录。
尝试这个:
$contactFilter = Restaurant::whereHas('contact', function ($contact) use ($cityRest) {
$contact->where('address', 'like', "%$cityRest%");
$contact->orWhereHas('city', function ($city) use ($cityRest) {
$city->where('cityName', 'like', "%$cityRest%");
});
});
推荐阅读
- android - 如何在 Kotlin 片段活动类中创建自定义操作栏
- typescript - 为什么字符串文字与枚举不匹配
- string - 为什么我的一些较大的 cytoscape 网络不可见?
- java - 如何回滚第一个事务而不回滚新事务?
- kubernetes - 如何从代码在 Grafana 中配置 Cloudflare 应用程序?
- asp.net - 一个来自rest服务的数据表和另一个来自SQL数据库的数据表,需要将SQL数据集附加到现有的数据表中
- python - 使用带有递归神经网络的顺序模型
- ios - Ionic 3 PWA 在 iOS 上无法顺利更新
- node.js - 如何使用环回 4 隐藏一条路由的开放 API 规范
- arrays - 如何在 laravel 集合中将数据访问方式从 data[key] 更改为 data->key?