2016-12-13 4 views
0

Я нашел эту функцию в Stackoverflow. Он позволяет определить ключевое слово, и функция проверяет, является ли она частью разных столбцов в моей базе данных.Laravel SearchByKeyword Область для отношений?

public function scopeSearchByKeyword($query, $keyword) 
    { 
     if ($keyword != '') { 
      $query->where(function ($query) use ($keyword) { 
       $query->where("reference", "LIKE","%$keyword%") 
        ->orWhere("title", "LIKE", "%$keyword%") 
        ->orWhere("description", "LIKE", "%$keyword%"); 
      }); 
     } 
     return $query; 
    } 

Теперь, я хочу добавить ->orWhere(), чтобы найти деревню. Однако в моей модели есть только поле под названием village_id, которое находится в связи с моим villages-table.

Итак, если бы я сделал ->orWhere("village_id", "LIKE", "%$keyword%");, он будет искать в столбцах только содержащие идентификаторы. Как я могу определить область, в которой он должен искать внутри <RelationName> -> name?

ответ

1

Вы можете использовать orWhereHas так:

public function scopeSearchByKeyword($query, $keyword) 
{ 
    if ($keyword != '') { 
     $query->where(function ($query) use ($keyword) { 
      $query->where("reference", "LIKE","%$keyword%") 
       ->orWhere("title", "LIKE", "%$keyword%") 
       ->orWhere("description", "LIKE", "%$keyword%") 
       ->orWhereHas('villages', function($q) use($keyword) { 
        $q->where('column_name', 'LIKE', "%$keyword%"); // <----- Do your stuff here. 
       }); 
     }); 
    } 
    return $query; 
} 

Надеется, что это помогает!

+0

Спасибо , но я не могу использовать ключевое слово $ внутри '$ q-> где()' явно. Есть идеи? – Scarwolf

+0

Просто используйте - 'use ($ keyword)' в закрытие, см. Обновленный ответ –

+0

Отлично работает! Потрясающие. Спасибо. – Scarwolf

1

Вы можете использовать orWhereHas методы для установки where условий на ваши запросы has. Этот метод позволяет добавлять собственные ограничения в отношениях ограничения, такие как проверка содержимого деревни, как:

->orWhereHas('villages', function($q) use($keyword) { 
    $q->where("title", "LIKE", "%$keyword%") 
}); 

Так окончательный запрос будет как:

$query->where(function ($query) use ($keyword) { 
    $query->where("reference", "LIKE","%$keyword%") 
     ->orWhere("title", "LIKE", "%$keyword%") 
     ->orWhere("description", "LIKE", "%$keyword%") 
     ->orWhereHas('villages', function($q) use($keyword) { 
      $q->where("title", "LIKE", "%$keyword%") 
     }); 
}); 

Docs

Смежные вопросы