@wagwandude

Как вывести последние обновления?

Здравствуйте.

Необходимо вывести последние статьи из таблицы следующим образом:

[ Звезды ]          [ Путешествия ]           [ Девушки ] 
5 записей           5 записей                 5 записей


При этом учесть, что одна статья может быть добавлена во все три категории. Соответственно, вывести её только в блоке первой категории, а из других двух удалить и заменить на другую статью из этой же категории, которая в свою очередь не входит в другие выведенные категории.

Имеются таблицы:
1. categories - [id, name, slug, display_home - важно учесть, чтобы display_home в where был равен 1]
2. item_category - [id, post_id, category_id]
3. posts - множество полей, но необходимы лишь - [id, title, slug]

Как мне составить максимально правильный запрос?
Я бы мог собрать новый массив, перебрав все статьи и вызвав запрос для вывода категорий в цикле, но этот вариант не подходит.

Как можно написать нечто подобное, используя Query Builder в Laravel?
  • Вопрос задан
  • 446 просмотров
Решения вопроса 1
parotikov
@parotikov
Wordpress, Laravel, OctoberCMS, Vue, Nuxt.js
Запросы query-buldera:
//достаем категории для главной
$categories = Category::where('display_home', 1)->get('id', 'name', 'slug');

//сюда будем схоронять посты, которые не должны повторяться
$posts_exclude = collection();

//для каждой категории
foreach ($categories as $category) {
	
	$posts_array[$category->title] = Post:: //ищем посты,
		whereHas('categories', function ($q) use ($category) { //у которых категория
			$q->where('id', $category->id); // одна из найденных для главной,
		})
		->whereNotIn('id', $posts_exclude->pluck('id')) // и постов нет в исключаемых
		->get('id', 'title', 'slug'); // только с нужными полями
	$posts_exclude->merge($posts_array[$category->id]); // добавили найденные посты в коллекцию с исключаемыми
}

Затем уже выводим массив с постами (псевдокод, это надо в блейд переписать):
<ul>
foreach ($posts_array as $category => $posts) {
	<li>
		$category //ключ основного массива - название категории 
		<ul>
		foreach ($posts as $post) { //значение элементов основного массива - набор постов из категории
			<li>$post->title</li>
		}
		</ul>
	</li>
}
</ul>


То есть, получаем n+1 запрос, где n - количество категорий.
Это в query-builder style. Можно, в принципе, написать один raw-запрос, но это уже за пределами топика.
Сложный одиночный query-builder запрос, полагаю, можно написать, но не вижу смысла, т.к. он будет не поддерживаемый. Да и закешить это всё можно, так что не в быстродействии дело.

p.s: Код негде проверить, писал по памяти. Надеюсь, ход мысли понятен
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы