@McMike

Чем отличается with от joinWith?

Чем отличается with от joinWith?
  • Вопрос задан
  • 5679 просмотров
Решения вопроса 1
qonand
@qonand
Software Engineer
with - делает жадную загрузку связанных данных
joinWith - делает жадную загрузку/отложенную загрузку связанных данных при этом для выборки основных данных использует JOIN построенный из связей

Например, есть модель:
class User extends \yii\db\ActiveRecord {

    public function getPosts(){
       return $this->hasMany(Post::className(), ['user_id' => 'id']);
    }
}


User::find()->with('posts') сделает следующее:
1. Найдет всех пользователей c помощью запроса SELECT * FROM user
2. У всех найденных пользователей выберет идентификаторы
3. Найдет все связанные данные с помощь запроса SELECT * FROM post WHERE user_id IN (1,2,3) // где 1,2,3 идентификаторы найденные в предыдущем пункте
4. Раставит соответствия между User и Post

User::find()->joinWith('posts') сделает все тоже, но вместо запроса SELECT * FROM user будет выполнен запрос
SELECT user.* FROM user
LEFT JOIN post ON post.user_id = user.id

Это удобно например для сортировки данных. Кроме того если в joinWith параметру eagerLoading задать значение false пункты 2-4 не будут выполнены, а будет просто сформирован и выполнен джойн.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@masterfreelance
программист со стажем
@karminski
Senior React.JS Developer
Важное отличие между joinWith() и with() в том, что первый метод "склеивает" строки двух таблиц и позволяет работать с данными как основной (primary) модели, так и связанной. Второй метод позволит после выборки работать с данными только основной модели.
Ответ написан
Ваш ответ на вопрос

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

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