Не получается написать нормальный SQL запрос в Yii2?
У меня есть 5 связанных таблиц:
course{id, name, ...} у нее модель Course
lesson{id, name, course_id, ...} у нее модель Lesson
theme{id, name, lesson_id, ...} у нее модель Theme
material{id, name, theme_id, ...} у нее модель Material
test_answer{..., material_id, ...} у нее модель TestAnswer
Я сделал таким образом:
public function getMaterial($material_id) { return Material::find()->where(['id' => $material_id, 'is_active' => 1])->orderBy('sort')->all(); } public function getTheme($theme_id) { return Theme::find()->where(['id' => $theme_id, 'is_active' => 1])->orderBy('sort')->all(); } public function getLesson($lesson_id) { return Lesson::find()->where(['id' => $lesson_id, 'is_active' => 1])->orderBy('sort')->all(); } public function getCourse($course_id) { return Course::find()->where(['id' => $course_id, 'is_active' => 1])->orderBy('sort')->all(); } public function getAnswerDestination($material_id) { $material = self::getMaterial($material_id); $theme_id = yiihelpersArrayHelper::getColumn($material, 'theme_id'); $theme = self::getTheme($theme_id); $lesson_id = yiihelpersArrayHelper::getColumn($theme, 'lesson_id'); $lesson = self::getLesson($lesson_id); $course_id = yiihelpersArrayHelper::getColumn($lesson, 'course_id'); $course = self::getCourse($course_id); $course_name = yiihelpersArrayHelper::getColumn($course, 'name'); $lesson_name = yiihelpersArrayHelper::getColumn($lesson, 'name'); $theme_name = yiihelpersArrayHelper::getColumn($theme, 'name'); $result_course = (object) [ 'id' => $course_id[0], 'name' => $course_name[0], ]; $result_lesson = (object) [ 'id' => $lesson_id[0], 'name' => $lesson_name[0], ]; $result_theme = (object) [ 'id' => $theme_id[0], 'name' => $theme_name[0], ]; $result = (object) [ 'course' => $result_course, 'lesson' => $result_lesson, 'theme' => $result_theme, ]; return $result; } |
public function getMaterial($material_id) { return Material::find()->where(['id' => $material_id, 'is_active' => 1])->orderBy('sort')->all(); } public function getTheme($theme_id) { return Theme::find()->where(['id' => $theme_id, 'is_active' => 1])->orderBy('sort')->all(); } public function getLesson($lesson_id) { return Lesson::find()->where(['id' => $lesson_id, 'is_active' => 1])->orderBy('sort')->all(); } public function getCourse($course_id) { return Course::find()->where(['id' => $course_id, 'is_active' => 1])->orderBy('sort')->all(); } public function getAnswerDestination($material_id) { $material = self::getMaterial($material_id); $theme_id = yiihelpersArrayHelper::getColumn($material, 'theme_id'); $theme = self::getTheme($theme_id); $lesson_id = yiihelpersArrayHelper::getColumn($theme, 'lesson_id'); $lesson = self::getLesson($lesson_id); $course_id = yiihelpersArrayHelper::getColumn($lesson, 'course_id'); $course = self::getCourse($course_id); $course_name = yiihelpersArrayHelper::getColumn($course, 'name'); $lesson_name = yiihelpersArrayHelper::getColumn($lesson, 'name'); $theme_name = yiihelpersArrayHelper::getColumn($theme, 'name'); $result_course = (object) [ 'id' => $course_id[0], 'name' => $course_name[0], ]; $result_lesson = (object) [ 'id' => $lesson_id[0], 'name' => $lesson_name[0], ]; $result_theme = (object) [ 'id' => $theme_id[0], 'name' => $theme_name[0], ]; $result = (object) [ 'course' => $result_course, 'lesson' => $result_lesson, 'theme' => $result_theme, ]; return $result; }
И он выводит объект такого вида
Но тут я использую сразу 4 sql запроса можно ли сделать что то наподобие этого:
SELECT course.name AS course , lesson.name AS lesson,theme.name AS theme FROM testanswer INNER JOIN materials ON materials.id= testanswer.material_id INNER JOIN theme ON theme.id= materials.theme_id INNER JOIN lesson ON lesson.id = theme.lesson_id INNER JOIN course ON course.id=lesson.course_id |
SELECT course.name AS course , lesson.name AS lesson,theme.name AS theme FROM testanswer INNER JOIN materials ON materials.id= testanswer.material_id INNER JOIN theme ON theme.id= materials.theme_id INNER JOIN lesson ON lesson.id = theme.lesson_id INNER JOIN course ON course.id=lesson.course_id
Дополнительно:
Пишу sql запросы в yii2 впервые, поэтому толком всех методов не знаю, и сделал вот такой костыль
Ответы:
Сделайте наподобие:
Course::find() ->alias('course') ->select('course.name, lesson.name, theme.name') ->leftJoin(['lesson' => Lesson::tableName()], 'lesson.course_id = course.id') ->leftJoin(['theme' => Theme::tableName()], 'theme.lesson_id = lesson.id') ->where(['theme.id' => $theme_id]) ->asArray() ->all(); |
Course::find() ->alias('course') ->select('course.name, lesson.name, theme.name') ->leftJoin(['lesson' => Lesson::tableName()], 'lesson.course_id = course.id') ->leftJoin(['theme' => Theme::tableName()], 'theme.lesson_id = lesson.id') ->where(['theme.id' => $theme_id]) ->asArray() ->all();
Что же до геттеров, то у вас с ними какая-то логическая проблема: выбираете модель по id, а потом сортируете ее одну и возвращаете all(). Сортировку можно убрать и возвращать one().
- Ваш код возвращает такие значения:
И про свою логическую проблему, я понимаю что код написан коряво и получился костыль, хотел бы разобраться на это примере как работают sql запросы в yii2
-
public function getAnswerDestination($material_id) { $theme_id = Material::findOne($material_id)->theme_id; $theme = Theme::findOne($theme_id); $lesson_id = $theme->lesson_id; $lesson = Lesson::findOne($lesson_id); $course_id = $lesson->course_id; $course = Course::findOne($course_id); return (object) [ 'course' => (object) [ 'id' => $course_id, 'name' => $course->name ], 'lesson' => (object) [ 'id' => $lesson_id, 'name' => $lesson->name ], 'theme' => (object) [ 'id' => $theme_id, 'name' => $theme->name ], ]; }
public function getAnswerDestination($material_id) { $theme_id = Material::findOne($material_id)->theme_id; $theme = Theme::findOne($theme_id); $lesson_id = $theme->lesson_id; $lesson = Lesson::findOne($lesson_id); $course_id = $lesson->course_id; $course = Course::findOne($course_id); return (object) [ 'course' => (object) [ 'id' => $course_id, 'name' => $course->name ], 'lesson' => (object) [ 'id' => $lesson_id, 'name' => $lesson->name ], 'theme' => (object) [ 'id' => $theme_id, 'name' => $theme->name ], ]; }
В общем написал такой код, выводит все правильно и вроде выглядит прилично
- Ace_Viral, ну естественно: я описал пример работы с запросами. Вам надо было просто подогнать его под свои нужды.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос


Для написания SQL запросов в Yii2 следует использовать класс QueryBuilder, который позволяет строить SQL запросы без явного указания SQL кода. Вместо этого вы можете использовать методы этого класса для создания запросов.
Пример использования QueryBuilder для создания SQL запроса в Yii2:
use yii\db\QueryBuilder; $query = new QueryBuilder(Yii::$app->db); $result = $query ->select(['id', 'name']) ->from('users') ->where(['status' => 1]) ->orderBy('name') ->all(); print_r($result);
В приведенном примере мы создаем новый объект QueryBuilder, указывая базу данных Yii::$app->db. Затем мы используем методы select, from, where, orderBy для создания SQL запроса. Наконец, мы вызываем метод all() для выполнения запроса и получения результата.
Если у вас все еще возникают проблемы с написанием SQL запросов в Yii2, убедитесь, что вы правильно настроили соединение с базой данных в файле конфигурации приложения (config/db.php). Также проверьте, что у вас установлен и настроен ActiveRecord для работы с базой данных.
Если у вас есть конкретный SQL запрос, который вам нужно выполнить, и у вас возникают проблемы с его написанием в Yii2, пожалуйста, предоставьте больше информации о запросе, чтобы мы могли вам помочь более точно.