@lolrofl01

Как указать название таблицы в результате, используя union?

Реализую поиск по нескольким таблицам в бд. Сейчас такой вариант:
$pages = Page::select('pages.id', 'pages.title', 'pages.slug')->where('title', 'LIKE', '%' . $string . '%');
$categories = Category::select('categories.id', 'categories.name', 'categories.fullSlug')->where('name', 'LIKE', '%' . $string . '%');
//Еще несколько таких же конструкций
$results = DB::table('posts as post')->select('post.id', 'post.title', 'post.slug')->where('title', 'LIKE', '%' . $string . '%')
$results = $results->union($pages)->union($categories)->get();

Вывод по запросу "кат":
#items: array:16 [
    0 => {#1279
        +"id": 126
        +"title": "Категория 2"
        +"slug": "category-2"
    }
    1 => {#1281
        +"id": 745
        +"title": "Пост в категории"
        +"slug": "post-in-category"
    }
    2 => {#1424
        +"id": 801
        +"title": "Страница-кат"
        +"slug": "page-cat"
    }
...
]


И вот в чем фигня. Все 3 результата из трех разных таблиц. Причем самая первая категория, у нее нет значения title, вместо него у нее name. Но имя у нее все равно отображается как title. Как узнать из какой таблицы было найдено значение? Потому что запросы мне надо разделить по категориям.

Говорят надо писать "From table as table1" типа того, я попробовал - алиасы никакую роль не играют ,вывод аналогичный. Есть другой вариант, задавать алиасы в селекте. Типа: 'category.name as category_name' и подобные. Но что, если поиск мы производим по 10 таблицам? А если по 20? Это же запаришься всем давать алиасы, и, самое главное, потом на вьюхе писать условия вида:
if( isset($result->category_name) ) {
//this is categories table
}


Как впихнуть в вывод (результат) имя таблицы, чтобы вывод стал таким?:
#items: array:16 [
0 => {#1279
    +"id": 126
    +"title": "Категория 2"
    +"slug": "category-2",
    'table' : 'categories'
}
1 => {#1281
    +"id": 745
    +"title": "Пост в категории"
    +"slug": "post-in-category",
    'table' : 'posts'
    }
    2 => {#1424
    +"id": 801
    +"title": "Страница-кат"
    +"slug": "page-cat",
    'table' : 'pages'
    }
...
]
  • Вопрос задан
  • 128 просмотров
Решения вопроса 1
alexey-m-ukolov
@alexey-m-ukolov Куратор тега Laravel
Union подразумевает, что у всех выборок одинаковая структура и столбцы, вот он и берёт из первой выборки названия.
Добавить же можно так:
select('pages.id', 'pages.title', 'pages.slug', DB::raw('"page" as `type`'))

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

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

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