Laravel whereHas没有得到任何结果?
Laravel whereHas not getting any results?
我有一个餐厅模型,每个餐厅都有一个联系人模型,
每个联系人都与一个城市模型相关:
Restaurant.php:
public function contact()
{
return $this->hasOne('App\Contact','rest_id');
}
Contact.php:
public function restaurant()
{
return $this->belongsTo('App\Restaurant','rest_id','id');
}
public function city()
{
return $this->belongsTo('App\City');
}
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();
搜索餐厅名称时,返回结果正确,但搜索城市名称时,没有返回任何结果,虽然有联系模型有城市的餐厅???
您正在搜索 "%$cityRest%"
作为字符串。
我觉得应该是这样的:
Restaurant::where('name', 'like', "%".$cityRest."%");
您必须使用 orWhereHas
而不是 whereHas
。
您使用 whereHas
搜索 contact.address
AND city.name
与您的输入匹配的餐馆。
通过使用 orWhereHas
,您正在搜索 contact.address
或 city.name
与您的输入匹配的餐馆。
AND 和 OR 运算符用于根据多个条件过滤记录:
- 如果由 AND 分隔的所有条件都为真,则 AND 运算符显示一条记录。
- 如果由 OR 分隔的任何条件为真,则 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%");
});
});
我有一个餐厅模型,每个餐厅都有一个联系人模型, 每个联系人都与一个城市模型相关:
Restaurant.php:
public function contact()
{
return $this->hasOne('App\Contact','rest_id');
}
Contact.php:
public function restaurant()
{
return $this->belongsTo('App\Restaurant','rest_id','id');
}
public function city()
{
return $this->belongsTo('App\City');
}
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();
搜索餐厅名称时,返回结果正确,但搜索城市名称时,没有返回任何结果,虽然有联系模型有城市的餐厅???
您正在搜索 "%$cityRest%"
作为字符串。
我觉得应该是这样的:
Restaurant::where('name', 'like', "%".$cityRest."%");
您必须使用 orWhereHas
而不是 whereHas
。
您使用 whereHas
搜索 contact.address
AND city.name
与您的输入匹配的餐馆。
通过使用 orWhereHas
,您正在搜索 contact.address
或 city.name
与您的输入匹配的餐馆。
AND 和 OR 运算符用于根据多个条件过滤记录:
- 如果由 AND 分隔的所有条件都为真,则 AND 运算符显示一条记录。
- 如果由 OR 分隔的任何条件为真,则 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%");
});
});