Laravel где несколько коллекций одновременно - PullRequest
0 голосов
/ 14 декабря 2018

Я хотел бы спросить, возможно ли использовать метод where в нескольких коллекциях одновременно ... лучше сказать, можно ли как-нибудь упростить этот код, пожалуйста?Большое вам спасибо.

$posts_per_weeks = array();

for($i = 10; $i > 0; $i--) {
    $my_posts = $user->posts()
        ->where('created_at', '>', Carbon::now()->subWeek($i))
        ->where('created_at', '<=', Carbon::now()->subWeek($i-1))
        ->count();
    $all_posts = Post::all()
        ->where('created_at', '>', Carbon::now()->subWeek($i))
        ->where('created_at', '<=', Carbon::now()->subWeek($i-1))
        ->count();
    array_push($posts_per_weeks, [$my_posts, $all_posts - $my_posts]);
}

Метод posts () выглядит следующим образом:

public function posts()
{
    if($this->hasAnyRole('broker|super-agent')) {
        $posts = $this->teams()->get()->map(function ($team) {
            return $team->posts->all();
        });
        if($this->hasRole('broker')) {
            $posts->push($this->hasMany('App\Post', 'broker_id')->get());
        }
        return $posts->collapse()->unique();
    } elseif($this->hasRole('admin')) {
        return Post::all();
    } else {
        return $this->hasMany('App\Post', 'agent_id')->get();
    }
}

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Вы можете использовать groupBy для группировки результатов

$maxWeeksBack = 10;
$myPostCount = $user->posts()->where('created_at', '>', Carbon::now()->subWeek($maxWeeksBack))
    ->select('id', DB::raw('count(*) as total'))
    ->groupBy(DB::raw('WEEK(created_at)'))
    ->get();

$postCount = Post::where('created_at', '>', Carbon::now()->subWeek($maxWeeksBack))
    ->select('id', DB::raw('count(*) as total'))
    ->groupBy(DB::raw('WEEK(created_at)'))
    ->get();

Возвращает количество сообщений и сообщений в виде массива, отсортированного по неделям.Вам нужно объединить два массива, чтобы получить массив, но это намного более чистый подход для подсчета количества сообщений.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Не проверял его вживую, но он должен работать

0 голосов
/ 14 декабря 2018

Вы можете использовать QueryScopes .

Post.php

class Post
{
    public function scopeFromWeek($query, $week) {
        return $builder->where('created_at', '>', Carbon::now()->subWeek($week))
                       ->where('created_at', '<=', Carbon::now()->subWeek($week-1));
    }
}

В вашем контроллере (или везде, где вы используете этот код)

$posts_per_weeks = [];

for($i = 10; $i > 0; $i--) {
    $my_posts = $user->posts()->fromWeek($i)->count();
    $all_posts = Post::fromWeek($i)->count();
    array_push($posts_per_weeks, [$my_posts, $all_posts - $my_posts]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...