Denwebart
@Denwebart

Выбор связей с помощью JOIN в Laravel 4.2?

Использую Laravel 4.2.
Я выбираю количество статей пользователя с помощью JOIN вот так:
User::join('pages as articles', 'articles.user_id', '=', 'users.id', 'left outer')->select([DB::raw('users.*, count(articles.id) as articlesCount')])->get()

В результате выбираются только те пользователи, у которых есть статьи.
Как выводить всех пользователей? Даже тех, у которых статей нет (нужно чтобы выводился ноль)?

Уточнение:
Есть таблица users:
d635fd2513d94886b40f52885a95811a.JPG
И есть таблица pages, где хранятся статьи и вопросы пользователей:
b6af05ca7fea4a6388ca103d3512ab26.JPG

Какие связи имеются:
public function publishedArticles()
	{
		return $this->hasMany('Page', 'user_id')->whereType(Page::TYPE_ARTICLE)
			->whereIsPublished(1)
			->where('published_at', '<', date('Y-m-d H:i:s'));
	}

public function publishedQuestions()
	{
		return $this->hasMany('Page', 'user_id')->whereType(Page::TYPE_QUESTION)
			->whereIsPublished(1)
			->where('published_at', '<', date('Y-m-d H:i:s'));
	}


Необходимо сделать выбор количества статей и вопросов пользователей в зависимости от заданного интервала времени. Чтобы по умолчанию выводились данные за весь период, и чтобы можно было отсортировать по времени создания статей и вопросов: за последний месяц, за конкретный месяц какого-то года и т.д.
Хотелось бы сделать это минимумом запросов в БД. В принципе, как реализовать, более-менее понятно, но получается очень много запросов.
  • Вопрос задан
  • 577 просмотров
Пригласить эксперта
Ответы на вопрос 1
@rsi
software engineer
А зачем вам вообще писать запрос? Используйте связи между моделями, по связи получите коллекцию с постами у нее есть метод count. Проще не бывает.

Ок, теперь смотрите я вам примеры прямо из официального туториала кидаю

$user = App\User::find(1);
$user->posts()->where('active', 1)->get();


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

Есть второй вариант, глава называется Querying Relationship Existence

// Retrieve all posts that have at least one comment...
$posts = App\Post::has('comments')->get();

// Retrieve all posts that have three or more comments...
$posts = Post::has('comments', '>=', 3)->get();

// Retrieve all posts that have at least one comment with votes...
$posts = Post::has('comments.votes')->get();

// Retrieve all posts with at least one comment containing words like foo%
$posts = Post::whereHas('comments', function ($query) {
    $query->where('content', 'like', 'foo%');
})->get();


Это выведет всех пользователей у которых записи в связанной таблице удовлетворяют вашим критериям. У тех кого не вывело соотвественно 0 и всего то.
Ответ написан
Ваш ответ на вопрос

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

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