WebSEOkz
@WebSEOkz
SEOшник, веб-разработчик

Laravel — как составить жадный Eloquent запрос?

Нужен жадный запрос Eloquent через модели.
Модели уже есть: Pagetype, Page, Service и Category, а таблица pagetype_service создана для связей.
В моделях уже прописаны соответствующие связи с другими моделями. Можно и новые связи сделать, если нужно.

pagetypes
    id
    ru_name
    sef_name

pagetype_service
    id
    page_id
    pagetype_id
    service_id

pages
    id
    title
    h1
    ...

services
    id
    category_id
    sef_url
    price
    ...

сategories
    id
    parent_id
    sef_url
    ...


Нужно получить все страницы из pages, которые соответствуют определённому типу из таблицы pagetypes. Я имею определённый sef_name.
Нужно получить все pages, но которые в таблице pagetype_service имеют pagetype_id равную соответствующему id полученному по sef_name из таблицы pagetypes.
Тамже в таблице pagetype_service есть поле service_id - это связь каждой страницы с таблицей services, и нужно получить соответствующие данные для каждой страницы
А в таблице services есть поле category_id, которое является связью с таблицей сategories и нужно получить эти данные тоже.

Возможно такое сделать в одном запросе?
Нужен жадный запрос, чтобы потом не появлялись отдельные запросы при обходе данных в цикле foreach
  • Вопрос задан
  • 279 просмотров
Решения вопроса 1
WebSEOkz
@WebSEOkz Автор вопроса
SEOшник, веб-разработчик
Спасибо, я тут кучу вариантов перепробовал, но нашёл решение.
У меня получилось так:

$sefName = 'проверка';
$pages = Page::whereHas('pagetypes', function ($query)  use ($sefName) {
    $query->where('sef_name', $sefName);
})->with('services.category')->get();
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
mashletov
@mashletov
Math.random()
$sefName = 'проверка';
$pages = Page::whereHas('service', function($query) use ($sefName) {
	$query->whereHas('pageType', function($query) use ($sefName) {
		$query->where('sef_name', $sefName);
	})->with('pageType');
})->with('service')->get();
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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