Completed
Push — master ( a30fc0...84b57d )
by Gino
01:44
created

PostsRelationScopeTrait::queryPostSlug()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 11
rs 9.9
c 0
b 0
f 0
cc 2
nc 2
nop 2
1
<?php
2
3
namespace GinoPane\BlogTaxonomy\Models;
4
5
use October\Rain\Database\Builder;
6
7
trait PostsRelationScopeTrait
8
{
9
    /**
10
     * @var array
11
     *
12
     * public static $sortingOptions
13
     */
14
15
    /**
16
     * Gets a list of items related to Posts for frontend use
17
     *
18
     * @param       $query
19
     * @param array $options Available options are "sort", "displayEmpty", "limit"
20
     *
21
     * @return mixed
22
     */
23
    public function scopeListFrontend(Builder $query, array $options = [])
24
    {
25
        $this->withRelation($query);
26
27
        $this->queryOrderBy($query, $options);
28
29
        $this->queryDisplayEmpty($query, $options);
30
31
        $this->queryPostSlug($query, $options);
32
33
        $this->queryLimit($query, $options);
34
35
        return $query->get();
36
    }
37
38
    /**
39
     * @param Builder $query
40
     * @param array   $options
41
     *
42
     * @return void
43
     */
44
    private function queryDisplayEmpty(Builder $query, array $options): void
45
    {
46
        if (empty($options['displayEmpty'])) {
47
            $query->withCount(
48
                [
49
                    'posts' => function ($query) {
50
                        $query->isPublished();
51
                    }
52
                ]
53
            )->where('posts_count', '>', 0);
54
        }
55
    }
56
57
    /**
58
     * @param Builder $query
59
     * @param array   $options
60
     *
61
     * @return void
62
     */
63
    private function queryPostSlug(Builder $query, array $options): void
64
    {
65
        if (!empty($options['post'])) {
66
            $query->whereHas(
67
                'posts',
68
                function ($query) use ($options) {
69
                    $query->whereSlug($options['post']);
70
                }
71
            );
72
        }
73
    }
74
75
    /**
76
     * @param Builder $query
77
     * @param array   $options
78
     *
79
     * @return void
80
     */
81
    private function queryLimit(Builder $query, array $options): void
82
    {
83
        if (!empty($options['limit'])) {
84
            $query->take($options['limit']);
85
        }
86
    }
87
88
    /**
89
     * @param Builder $query
90
     * @param array   $options
91
     *
92
     * @return void
93
     */
94
    private function queryOrderBy(Builder $query, array $options): void
95
    {
96
        if (in_array($options['sort'], array_keys(self::$sortingOptions))) {
97
            if ($options['sort'] == 'random') {
98
                $query->inRandomOrder();
99
            } else {
100
                list($sortField, $sortDirection) = explode(' ', $options['sort']);
101
102
                if ($sortField == 'posts_count') {
103
                    $query->withCount(
104
                        [
105
                            'posts' => function ($query) {
106
                                $query->isPublished();
107
                            }
108
                        ]
109
                    );
110
                }
111
112
                $query->orderBy($sortField, $sortDirection);
113
            }
114
        }
115
    }
116
117
    /**
118
     * @param Builder $query
119
     *
120
     * @return void
121
     */
122
    private function withRelation(Builder $query): void
123
    {
124
        $query->with(
125
            [
126
                'posts' => function ($query) {
127
                    $query->isPublished();
128
                }
129
            ]
130
        );
131
    }
132
}