Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 17.05.2014 13:25:37

Laravel Eloquent

Доброго времени суток! Возникла проблема сделать поиск на сайт. Начал делать, но столкнулся с проблемой, а именно при выборке  из БД мне возвращается объект типа 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));
	}

Заранее благодарен.

Не в сети

#2 17.05.2014 13:41:35

Re: Laravel Eloquent

  1. PHPif($searchTerms[0] == $term)

Это плохой вариант инициализировать $posts. Что, если передано ?search=term1,term2,term1? Последний term1 заменит собой term2. Вместо этого можно так:

PHP
    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 == $posts $query->first() : $posts->merge($query->get());
    }

Больше нет дублирующегося кода.

Насчёт повторяющихся результатов ничего не могу сказать, надо смотреть на таблицу. Так не понятно.

Не в сети

#3 17.05.2014 18:02:49

Re: Laravel Eloquent

Все! Проблема решена. Спасибо вам, Proger_XP. Результаты у меня повторялись, так как я просматривал var_dump’ом, то, что получил и еще забыл <pre> дорисовать, а там каждая модель имеет два разных свойства, в которых значения одинаковые.
Потратив еще некоторое количество времени на изучение Eloquent API я пришел к вот такому коду:
Немного прокомментирую его, возможно кому-то пригодится)

PHP
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));
    }

Не в сети

Подвал раздела