2015-02-21 2 views
42

Итак, я пытаюсь получить количество отдельных сообщений в запросе, но возвращаемое значение неверно.Laravel Eloquent - distinct() и count() не работают должным образом вместе

Это то, что я пытаюсь сделать:

$ad->getcodes()->groupby('pid')->distinct()->count() 

, что возвращает значение «2», в то время как значение должно вернуться, должно быть «1».

В качестве обходного пути, я делаю это:

count($ad->getcodes()->groupby('pid')->distinct()->get()) 

, что отлично работает и возвращает «1»

Есть ли правила, где граф и отчетливый не может быть на том же запросе? Я нашел обходной путь своего рода «тяжелый», я хотел бы сделать оригинальное произведение запрос :(

+0

Что вы делаете в вашей таблице образцов в базе данных? И чего вы хотите достичь? Теперь вы должны, вероятно, получить количество различных значений в столбце 'pid', так что если в вашей таблице 2 записи - одна с pid 1, вторая с pid 2, счет должен возвращаться 2. –

+0

вы можете просто заменить get на count в этом путь: '$ Count = DB :: таблица ('имя_таблицы') -> Количество (DB :: сырец ('DISTINCT PID'));' также можно сделать: 'DB :: таблицу ('имя_таблицы ') -> distinct (' pid ') -> count (' pid '); ' – bharat

ответ

0

Попробуйте следующее:

$ad->getcodes()->groupby('pid')->distinct()->get()->count() 
+4

Это неправильный помощник, я точно стараюсь избегать вызова метода get(). В любом случае, вышеупомянутое не работает, поскольку оно возвращает 0; но спасибо за ответ! –

49

Следующая должен работать

$ad->getcodes()->distinct('pid')->count('pid'); 
+2

Имел подобный вопрос, и, похоже, просто уходит из 'groupBy' делает трюк. – jeteon

+4

К сожалению, это не сработает. –

+0

он работает для меня. –

-1

В этом работает для меня так Попробуйте это:. $ Ad-> getcodes() -> различны ('PID') -> счетчик()

+0

Привет приветствую вас. При ответе на вопрос, пожалуйста, предоставьте дополнительную информацию о коде, который вы поставляете.Взносы, подобные этому, приветствуются, но другие в будущем могут извлечь выгоду из описания выстрела – Deepend

3

у меня была аналогичная проблема, и нашел способ работать вокруг него

Проблема заключается в том, как построитель запросов Laravel обрабатывает агрегаты. Он возвращает первый результат и возвращает значение «aggregate». Обычно это нормально, но когда вы комбинируете count с groupBy, вы возвращаете счет за сгруппированный элемент. Таким образом, агрегат первой строки - это просто счет первой группы (так что, вероятно, что-то вроде 1 или 2).

Итак, счет Laravel отсутствует, но я объединил построитель запросов Laravel с некоторым сырым SQL, чтобы получить точное количество моих сгруппированных результатов.

Для примера, я ожидаю, что следующее должно работать (и позволяют избежать ГЭТ):

$query = $ad->getcodes()->groupby('pid')->distinct(); 
$count = count(\DB::select($query->toSql(), $query->getBindings())); 

Если вы хотите, чтобы убедиться, что вы не тратить время выбирающий все столбцы, вы можете избежать что при построении запроса:

$query = $ad->select(DB::raw(1))->getcodes()->groupby('pid')->distinct(); 
7

Кто-нибудь еще сталкивается с этим сообщением и не находит другие предложения для работы?

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

SELECT COUNT(*) FROM (SELECT * FROM a GROUP BY b) 

или использовать COUNT(DISTINCT b):

SELECT COUNT(DISTINCT b) FROM a 

Через некоторое замешательство вокруг, я понял, что не было никакой встроенной Laravel функции либо для этого. Поэтому самым простым решением было использование использования DB::raw с методом count.

$count = $builder->count(DB::raw('DISTINCT b')); 

Помните, не используйте groupBy перед вызовом count. Вы можете применить groupBy позже, если вам это нужно для получения строк.

+0

хороший отзыв! это работало для меня как шарм. – the0ther

+0

Откуда появился $ builder? – Andrew

+1

@Andrew Создатель запросов Laravel, который вы используете для запроса. Например, объект Eloquent '$ books = Book :: where (...) -> count (...)' – Zoon

0

Я столкнулся с той же проблемой.

При установке Laravel отладки бар вы можете увидеть запросы и часто видят проблему

$ad->getcodes()->groupby('pid')->distinct()->count() 

изменение

$ad->getcodes()->distinct()->select('pid')->count() 

Вы должны установить значения для возврата в отличие. Если вы не установите поля выбора, он вернет все столбцы в базе данных, и все они будут уникальными. Поэтому установите запрос в отдельный и выберите только столбцы, которые составляют ваше «отличное» значение, которое вы, возможно, захотите добавить. ->select('pid','date'), чтобы получить все уникальные значения для пользователя за один день

1

Не так ли?

$ad->getcodes()->distinct()->get(['pid'])->count(); 

См here для обсуждения ..

+2

Это нехорошее решение, потому что вызов 'get()' будет выполнять запрос и возвращать результаты из базы данных, а затем 'count()' выполняется в коллекции. –

0
DB::table('adverts')->distinct()->select('ad_advertiser')->get() 
0

Более общий ответ, который бы спас мне время, и, надеюсь, другие:

Не работает (возвращает количество всех строк) :

DB::table('users') 
      ->select('first_name') 
      ->distinct() 
      ->count(); 

Исправление:

DB::table('users') 
      ->distinct() 
      ->count('first_name'); 
Смежные вопросы