Laravel - перекрестное соединение не возвращает все столбцы

╔═══╦══════════════╦═════════════╗
║   ║id            ║name         ║
╠═══╬══════════════╬═════════════╣
║   ║ 1            ║a1           ║
║   ║ 2            ║b1           ║
║   ║ 3            ║b2           ║
║   ║ 4            ║c1           ║
║   ║ 5            ║c2           ║
╚═══╩══════════════╩═════════════╝

Это моя таблица в mysql

Выполнение этого запроса в mysql:

select * from (select * from courses where name like 'a%') as t1 cross join (select * from courses where name like 'b%') as t2 cross join (select * from courses where name like 'c%') as t3

возвращает это:

Laravel - перекрестное соединение не возвращает все столбцы

Однако, когда я пытаюсь запустить его на larael, чтобы отобразить результат, я получаю что-то другое.

Вот как я выполняю в laravel:

$posts = DB::select(DB::raw("select * from (select * from courses where name like 'a%') as t1 cross join (select * from courses where name like 'b%') as t2 cross join (select * from courses where name like 'c%') as t3"));

Вот что возвращает $posts:

[{"id":4,"name":"c1"},{"id":4,"name":"c1"},{"id":5,"name":"c2"},{"id":5,"name":"c2"}]

Я полагаю, он возвращает только последние два столбца запроса, если мы сравним его с исходным результатом, возвращенным в mysql.

Есть идеи, как получить полный результат?

Каков результат DB::raw без DB::select?

Quezler 06.05.2018 12:19

@Quezler возвращает запрос обратно! : выберите * из (выберите * из курсов, где имя как 'a%') как перекрестное соединение t1 (выберите * из курсов, где имя как 'b%') как перекрестное соединение t2 (выберите * из курсов, где имя как 'c%' ) как t3

valar morghulis 06.05.2018 12:20

Попробуйте заключить свои подзапросы в круглые скобки.

Namoshek 06.05.2018 14:09
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
3
1 955
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

t3 перезаписывает значения t1 и t2. Вы должны использовать псевдонимы:

select t1.id as t1_id, t1.name as t1_name,
    t2.id as t2_id, t2.name as t2_name,
    t3.id as t3_id, t3.name as t3_name

Вы также должны использовать построитель запросов вместо необработанного SQL.

Спасибо. Есть ли какой-то особый недостаток в использовании необработанного SQL? Я считаю, что необработанный SQL более естественен.

valar morghulis 06.05.2018 15:37

Когда вы вставляете пользовательский ввод в запрос, намного сложнее писать небезопасный код с помощью построителя запросов. Также вы можете использовать один и тот же PHP-код для нескольких баз данных (MySQL, SQLite и т. д.).

Jonas Staudenmeir 06.05.2018 15:44

Могу ли я включить в этот запрос предложение where? Если я попробую добавить это так: выберите t1.id как t1_id, t1.name как t1_name, t2.id как t2_id, t2.name как t2_name, t3.id как t3_id, t3.name как t3_name (выберите * из курсов, где назовите как 'a%') как перекрестное соединение t1 (выберите * из курсов, где имя как 'b%') как перекрестное соединение t2 (выберите * из курсов, где имя как 'c%') как t3, где t1_name = 'test'; Выдает ошибку "# 1054 - Неизвестный столбец" t1_name "в предложении where

valar morghulis 28.07.2018 23:57

Используйте оригинальное название столбца: where('t1.name', 'test')

Jonas Staudenmeir 29.07.2018 01:01

Другие вопросы по теме