Не получается написать нормальный SQL запрос в Yii2?

Ссылка скопирована
1 ответ

У меня есть 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; }

И он выводит объект такого вида

Не получается написать нормальный SQL запрос в Yii2?

Но тут я использую сразу 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?

    И про свою логическую проблему, я понимаю что код написан коряво и получился костыль, хотел бы разобраться на это примере как работают 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, ну естественно: я описал пример работы с запросами. Вам надо было просто подогнать его под свои нужды.
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Павел Админов Ответ

Для написания 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);

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, пожалуйста, предоставьте больше информации о запросе, чтобы мы могли вам помочь более точно.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно