【问题标题】:Laravel whereHas not getting any results?Laravel 在哪里没有得到任何结果?
【发布时间】:2019-12-21 22:42:42
【问题描述】:

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

餐厅.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');
}

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

搜索餐厅名称时,结果返回正确,但搜索城市名称时,没有返回任何内容,虽然有联系模型的餐厅有城市???

【问题讨论】:

  • 您可以尝试在您的contactFilter 中使用orWhereHas 而不是whereHas,例如:$contact->orWhereHas('city'...
  • @Remul...哇,它真的奏效了!!
  • 但是为什么会这样呢??

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


【解决方案1】:

您必须使用orWhereHas 而不是whereHas

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

通过使用orWhereHas,您正在搜索contact.addresscity.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%");
    });

});

【讨论】:

    【解决方案2】:

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

    我觉得应该是这样的:

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

    【讨论】:

    • 审查 php 的字符串互穿,我应该给你一票否决,但我不会
    猜你喜欢
    • 2013-03-27
    • 2023-04-01
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多