Как получить одним запросом отношения, чтобы они проходили фильтрацию по полученным значениям из отношений?

В Laravel, чтобы получить отношения с фильтрацией по значениям из других отношений, можно использовать метод whereHas.

whereHas позволяет указать условия фильтрации для связанных моделей. Применение whereHas позволяет получить только те записи, которые удовлетворяют условиям фильтрации в связанной модели.

Для демонстрации концепции, рассмотрим пример моделей User и Post, где связь между ними это "один ко многим". У каждого пользователя может быть несколько постов. Посты имеют статус "опубликовано" или "черновик". Мы хотим получить только те пользователей, у которых есть опубликованные посты.

Для начала создадим соответствующие модели и опишем их отношения:

class User extends Model
{
    public function posts()
    {
        return $this->hasMany(Post::class);
    }
}

class Post extends Model
{
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

Затем, чтобы получить пользователей с опубликованными постами, можно сделать следующий запрос:

$usersWithPublishedPosts = User::whereHas('posts', function ($query) {
    $query->where('status', 'published');
})->get();

Здесь мы использовали метод whereHas, чтобы указать, что мы хотим получить только пользователей, у которых есть посты, удовлетворяющие условию status = 'published'. Метод get в конце запроса возвращает коллекцию моделей, удовлетворяющих указанным условиям.

Таким образом, использование метода whereHas позволяет получить отношения, которые проходят фильтрацию по значениям из других отношений одним запросом.