Laravel在哪里没有得到任何结果?

时间:2019-08-15 13:39:08

标签: laravel laravel-5 eloquent laravel-query-builder wherehas

我有一个餐厅模型,每个餐厅都有一个联系人模型, 每个联系人都与城市模型有关:

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();

当搜索餐厅名称时,结果会正确返回,但是当搜索城市名称时,不会返回任何结果,尽管有些餐厅的联系方式中包含城市名称。

2 个答案:

答案 0 :(得分:1)

您必须使用orWhereHas而不是whereHas

使用whereHas,您正在搜索contact.address AND city.name与您的输入匹配的餐馆。

通过使用orWhereHas来搜索contact.address OR city.name与您的输入相匹配的餐馆。


AND和OR运算符用于根据多个条件过滤记录:

  • 如果用AND分隔的所有条件均为TRUE,则AND运算符将显示一条记录。
  • 如果由OR分隔的任何条件为TRUE,则OR运算符将显示一条记录。

source


尝试一下:

$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%");
    });

});

答案 1 :(得分:0)

您正在搜索"%$cityRest%"作为字符串。

我认为应该是这样的:

Restaurant::where('name', 'like', "%".$cityRest."%");