@Binarix

Какой метод обращения к БД использовать в Yii2 лучше?

Здравствуйте. Недавно начал изучать замечательный фреймворк Yii2. В инструкции указаны несколько способов выборки из БД. Можно использовать построитель запросов, можно ActiveRecord. В первом случае я могу сделать вот такой запрос:
$data= (new Query())
        ->select(['title', 'text', 'category'])
        ->from('Posts')
        ->leftJoin('category', 'posts.id_categoryes = category.id_category')
        ->all();

и во вьюхе вывести потом информацию
<?php foreach ($data as $key => $row): ?>
         <?= $row['title']?>
         <?= $row['category']?>
         <?= $row['text']?>
<?php endforeach ?>

Во втором случае запрос выглядит вот так:
$data = Posts::find()->all();
гораздо более приятно глазу и проще, но есть для меня подводный камень, а именно реляционная связь, описанная в модели
public function getIdCategoryes()
    {
        return $this->hasOne(Category::className(), ['id_category' => 'id_categoryes']);
    }


благодаря которой вьюха немного усложняется
<?php foreach ($data as $key => $row): ?>
          <?= $row['title']?>
          <?= $row->idCategoryes->category;?>
          <?= $row['text']?>
 <?php endforeach ?>


Какие минусы я получу, если буду использовать построитель запросов? Мне кажется он более лаконичным, выбираю практически на чистом sql только нужные мне поля.
  • Вопрос задан
  • 523 просмотра
Решения вопроса 2
Akdmeh
@Akdmeh
PHP, Yii2, Music
Если это одиночные объекты - смело можете использовать ActiveRecord. Краткость кода и удобство написания и поддержки кода перевешивает небольшой оверхед в создании объектов (который, на практике, никакой роли играть не будет).
А вообще, разницы между использованием "строителя запроса" и между использованием AR почти что нет, разве что использовать DAO - небольшой надстройке над PDO, которая доступна через Yii::$app->db (то есть, стандартный компонент соединения к базе данных).
Но если объектов десятки и сотни - я использую, обычно, asArray()->all();, чтобы получать результат из таблицы в виде массивов. Это покрывает 95% необходимого кода для работы с базами данных (ну, как мне кажется). Если нужен более низкоуровневый интерфейс - всегда можно определить метод в объекте AR, который возвратит необходимые данные, и внутри него произойдет необходимый запрос.
Кстати, посоветую включить кеширование схем таблиц - очень помогает в ускорении работы AR в будущем.
Ответ написан
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
На мой взгляд надо использовать тот что позволяет получить необходимый результат. Если оба его дают, тот что более читабельный. Если Вас интересует производительность, тогда не стоит использовать фреймворки и пишите запросы чистым php.
На самом же деле ActiveQuery
$data = Posts::find()->all();
расширяет Query
$data= (new Query())
так что второй должен быть менее ресурсозатратным, но все зависит от того, как Вы составите запрос.
Я использую ActiveQuery, там где это возможно (99% случаев)
К тому же если вас напрягает
$row->idCategoryes->category;
Создайте в моделе метод getCategory и будет во вьюхе у Вас:
$row->category;
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы