Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Доброго времени суток! Возникла проблема сделать поиск на сайт. Начал делать, но столкнулся с проблемой, а именно при выборке из БД мне возвращается объект типа Collection, но результаты в нём повторяются.
Ниже приведу код екшена поиска:
.
public function searchPost()
{
$request = Input::get('search');
$searchTerms = explode(',', $request);
foreach ($searchTerms as $term)
{
$term = trim($term);
if($searchTerms[0] == $term)
{
$posts = Post::where('full_article', 'LIKE', "%{$term}%")
->orWhere('short_article', 'like', "%{$term}%")
->orWhere('title', 'like', "%{$term}%")->first();
continue;
}
$posts->merge(Post::where('full_article', 'LIKE', "%{$term}%")
->orWhere('short_article', 'like', "%{$term}%")
->orWhere('title', 'like', "%{$term}%")->get());
}
header('Content-Type: text/html; charset=utf-8');
var_dump($posts);
return View::make('blog.posts.search-posts')
->with('posts', $posts->paginate(1));
}
Заранее благодарен.
Не в сети
PHPif($searchTerms[0] == $term)
Это плохой вариант инициализировать $posts. Что, если передано ?search=term1,term2,term1? Последний term1 заменит собой term2. Вместо этого можно так:
foreach ($searchTerms as $i => $term)
{
$term = trim($term);
$query = Post::where('full_article', 'LIKE', "%$term%")
->orWhere('short_article', 'like', "%$term%")
->orWhere('title', 'like', "%$term%");
$i == 0 ? $posts = $query->first() : $posts->merge($query->get());
}
Больше нет дублирующегося кода.
Насчёт повторяющихся результатов ничего не могу сказать, надо смотреть на таблицу. Так не понятно.
Не в сети
Все! Проблема решена. Спасибо вам, Proger_XP. Результаты у меня повторялись, так как я просматривал var_dump’ом, то, что получил и еще забыл <pre> дорисовать, а там каждая модель имеет два разных свойства, в которых значения одинаковые.
Потратив еще некоторое количество времени на изучение Eloquent API я пришел к вот такому коду:
Немного прокомментирую его, возможно кому-то пригодится)
public function searchPost()
{
$request = Input::get('search');
$searchTerms = explode(',', $request);
foreach ($searchTerms as $i => $term)
{
$searchTerms[$i] = trim($term);
}
$searchTerms = array_unique($searchTerms);//Здесь я уже имею массив с уникальными значениями
$posts = null;
foreach ($searchTerms as $i => $term)
{
if($i == 0)
{
//Использую Eloquent вместо QueryBuilder, потому что выводить надо автора и категорию(relationships)
$posts = Post::where('full_article', 'LIKE', "%{$term}%")
->orWhere('short_article', 'like', "%{$term}%")
->orWhere('title', 'like', "%{$term}%");
continue; //Для первого ключевого слова значение переменной присваивается, а для остальных запрос составляется далее
}
$posts = $posts->orWhere('full_article', 'LIKE', "%{$term}%")
->orWhere('short_article', 'like', "%{$term}%")
->orWhere('title', 'like', "%{$term}%");
/*Этот запрос вернет уникальную Eloquent коллекцию (Советую почитать о том, что такое Eloquent коллекция, потому как надо будет понимать почему вылазят ошибки запросов к БД и как их исправить). Что это значит? Допустим в базе есть две статьи:
1) Привет, Вася!
2) Привет, Петя и Вася!
Когда поисковый запрос будет таким: Вася, Привет - он подойдет как к первой статье, так и ко второй и причем
каждое ключевое слово "Вася" и "Привет" подходит к обеим статьям. Можно предположить, что на вывод пойдет 4
статьи, то есть две статьи по два раза каждая, но как я написал выше, это возвратит уникальную коллекцию елементов.
Знайте это, когда будете составлять похожие запросы, либо делать поиск, потому что найти решение этой проблемы
заняло у меня немало нервов и времени.
}
return View::make('blog.posts.search-posts')
->with('posts', $posts->paginate(1));
}
Не в сети
Страницы 1