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

Если вам необходимо работать с двумя связями к одной таблице, отличающимися только сортировкой или фильтром, в Laravel можно использовать функциональность "отложенных связей" (Eager Loading) и методы orderBy и where.

Предположим, у вас есть модель User и для нее две связи с моделью Post - posts, которая возвращает все посты пользователя без фильтрации, и filteredPosts, которая возвращает только посты пользователя, отфильтрованные по какому-либо критерию.

Чтобы работать с отложенными связями, вы должны установить отношение между моделями User и Post, используя методы hasMany или hasOne. Например:

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

    public function filteredPosts()
    {
        return $this->hasMany(Post::class)->where('status', 'published');
    }
}

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

$user = User::find(1);
$posts = $user->posts()->orderBy('published_at', 'desc')->get();

Если вам нужны только отфильтрованные посты пользователя, вы можете использовать отложенную связь filteredPosts:

$user = User::find(1);
$filteredPosts = $user->filteredPosts()->get();

Вы также можете использовать цепочку методов для применения как сортировки, так и фильтрации одновременно:

$user = User::find(1);
$filteredAndSortedPosts = $user->filteredPosts()->orderBy('published_at', 'desc')->get();

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