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