Задать вопрос
@yura_born

Какие способы формирования запросов к БД в Yii2 лучше?

Вопроса впринципе 2.
1. У меня БД MySQL и Yii2 в основном будет необходимо составлять запросы через Inner Join к 3 и более таблицам. Как лучше это делать через метод ActiveRecord findBySql() и составляя свой запрос или через метод find (), ?
На данном этапе я не понял как вообще реализовать связку в этом случае. Можно ли это сделать?

2. у меня 3 таблицы:
-sotr(id; name)
--sotr_podr(id; id_sotr; id_podrazd)
---podrazd(id; podrazd)

В модели сделал вот такую связку
public function getPodrazd()
    {
        return $this->hasMany(Podrazdelenie::className(), ['id' => 'id_podrazd'])
            ->viaTable('sotr_podr', ['id_sotr' => 'id']);
    }


в контроллере пишу так:
$sotrudniki=Sotrudnik::find()->asArray()->all();

однако связи нет, данные выводятся только из таблицы sotr
  • Вопрос задан
  • 466 просмотров
Подписаться 2 Простой 1 комментарий
Решения вопроса 2
myks92
@myks92 Куратор тега Yii
Нашёл решение — пометь вопрос ответом!
Если вам важна производительность и хороший код, то на все чтения делаем обычные SQL запросы или используем Query Builder от Yii2.

ActiveRecord работает с объектами, поэтому он сильно «ударяет» по производительности при составлении больших и сложных запросов. Кроме того, в объектах AR не только сами данные, но и: поведения, события, валидация...

Если брать CRUD (Cread Read Update Delete), то для CUD (модификация данных) использовать ActiveRecord. А там где R (чтение) - используем SQL и QB. В таком случае вы будете работать с данными в виде массива, либо в виде простых DTO, на которые вы сами «маппите» данными из запроса. DTO будет удобно использовать для работы. $dto->name вместо $items['name']. Хотя, если вы используете шаблонизатор twig, — Вам особо без разницы. Но на PHP объекты (DTO) вам ещё и удобно будет использовать в редакторе.

При таком подходе код будет чище, а производительность выше!
Ответ написан
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
$sotrudniki=Sotrudnik::find()->asArray()->all();

И где тут связь должна дергаться? Модель не дергает связи пока Вы этго не попросите. В модели Вы описываете, как строить связь. Это не значит, что все запросы теперь будут тянуть ненужные им связи. Откройте документацию:
https://www.yiiframework.com/doc/guide/2.0/en/db-q...
https://www.yiiframework.com/doc/api/2.0/yii-db-ac...
Что бы дернулась связь getPodrazd() надо как-то так строить:
$sotrudniki = Sotrudnik::find()->joinWith('podrazd', true, 'INNER JOIN')->all();

Совет. Никогда, ни при каких условиях, не используйте русские названия. Даже в плохих компаниях за такое отрывают руки.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы