Поле родительской таблицы Laravel Eloquent orderBy () в отношении один ко многим

Итак, у меня есть таблица questions и таблица steps. steps может иметь много questions. question относится к «ступенькам».

У меня есть поле step_id в моей таблице questions, которое является внешним ключом поля id в моей таблице steps. У меня также есть поле number в моей таблице steps, которое НЕ имеет ничего общего с полем id. Это просто число (1-12).

Таблица вопросов

---------------------------
| id | step_id | question |
---------------------------

Таблица шагов

-----------------------------
| id | number | description |
-----------------------------

У меня отношения работают нормально, так как я могу создавать, обновлять и удалять вопросы из таблицы questions. Однако я работаю над индексной страницей и хочу собрать все вопросы и отсортировать их по полю number в таблице steps.

Я провел небольшое исследование и нашел этот небольшой фрагмент кода из Laracasts, но он не работает. На сайте было представлено немного информации. Нужна ли мне зависимость, чтобы получить эту функциональность, или есть собственный способ сделать это в laravel.

$questions = Question::join('steps', 'questions.step_id', '=', 'questions.id')
->orderBy('questions.number', 'asc')
->get(['questions.*']);

Я получаю следующую ошибку:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'questions.number' in 'order clause' (SQL: select questions.* from questions inner join steps on questions.step_id = questions.id order by questions.number asc)

Может, я просто недостаточно хорошо разбираюсь в отношениях, чтобы делать это. Но я в растерянности. Любая помощь будет оценена по достоинству.

Стоит ли изучать 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 и хотите разрабатывать...
1
0
1 465
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Давайте разберемся, что не так с этим запросом (также обратите внимание, что здесь вы выполняете обычное соединение SQL, а не используете отношения Eloquent - что правильно для этого случая):

// You are comparing the `step_id` on `questions` to the `id` on `questions`
// Which doesn't make sense, you should compare it to the `id` on `steps` table
$questions = Question::join('steps', 'questions.step_id', '=', 'questions.id')
    // You're trying to order by a column on `steps` table, but
    // you're explicitily looking for it on `questions` table
    ->orderBy('questions.number', 'asc') // <-- you get the SQL error because of this
    ->get(['questions.*']);

Теперь давайте исправим эти проблемы:

$questions = Question::join('steps', 'questions.step_id', '=', 'steps.id')
    ->orderBy('steps.number', 'asc') 
    ->get(['questions.*']);

Хороший ответ. Хорошее объяснение.

Barns 21.05.2018 02:16

+ devk @devk Спасибо за ответ, теперь есть способ разбить этот результат на страницы? Я забыл задать это в своем предыдущем вопросе.

J. Robinson 21.05.2018 03:07

@ J.Robinson Ага, просто сделай это: ->select('questions.*')->paginate() вместо ->get(..).

DevK 21.05.2018 03:08

Вы, сэр, АБСОЛЮТНЫЙ БОСС! большое спасибо! : P Это очень помогает! : P Заставил работать на 100% так, как я хотел!

J. Robinson 21.05.2018 03:09

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