Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 02.04.2017 17:42:54

Почему Query Builder в Laravel 5.2 возвращает объект?

Хочу посчитать количество записей по условию следующим кодом:

public function scopeActive_cnt($query)
{
    return $query->where('active',1)->count();
}

Если есть хотя бы одна запись, то возвращается число, но если записей нет, то возвращается объект билдера. Как правильно считать билдером?

Не хочется делать так:

Model::active()->count();

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

select count(*) as aggregate from `table`

Не в сети

#2 02.04.2017 22:34:13

TrueKanonir
Откуда: Ташкент
Сообщений: 221

Re: Почему Query Builder в Laravel 5.2 возвращает объект?

Я бы перенес это на коллекции. Скорее всего записи уже выбраны:

// Если выбраны записи с active 1
$articles->count();
// Если выбраны все записи без where
$articles->where('active' 1)->count();

Не в сети

#3 03.04.2017 04:53:10

Re: Почему Query Builder в Laravel 5.2 возвращает объект?

скоупы предназначены не для выборки данных а для настройки параметров построителя запросов. поэтому вариант

public function scopeActive($query) { $query->whereActive(true); }
Article::active()->count()

является правильным способом их использования. как минимум потому что позволяет сделать ещё и

Article::active()->latest()->forPage(1, 5)->get()

это как раз то для чего скоупы и нужны. если нужен специальный отдельный метод который отдаст только количество, его можно просто объявить как статический метод на модели или (если ожидается что модели будут сложными) вообще создать ArticleRepository. по использованию паттерна «репозиторий» в ларавеле статей понаписано достаточно

Не в сети

Подвал раздела