Laravel по-русски

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

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

#1 16.07.2017 22:34:02

Добавить кастомное поле к каждому элементу коллекции

Есть запрос

$data = Analytics::select($stat)->whereBetween('date', [$daterangepicker_start, $daterangepicker_end])->groupBy($stat)->get();

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

Analytics::select($stat)->whereBetween('date', [$daterangepicker_start, $daterangepicker_end])->where($stat, '=', сюда передать ячейку из запроса который выше)->groupBy($stat)->get();

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

Второй запрос один в один только без гроуп бай

пс в постгрии если делать гроупбай то он просит добавить эту ячейку в селект, это косяк самого постгриии?

Не в сети

#2 16.07.2017 23:14:32

Re: Добавить кастомное поле к каждому элементу коллекции

пс в постгрии если делать гроупбай то он просит добавить эту ячейку в селект, это косяк самого постгриии?

Нет, это MySQL в некоторых случаях слишком добрый, что позволяет селектить поля, которые не участвуют в группировке или агрегатных функциях.
Многие разработчики, особенно самоучки, и не подозревают, что их запросы работают, только потому, что MySQL лояльный.

А сам твой вопрос - не понял.
Распиши подробнее.

Изменено covobo (16.07.2017 23:15:00)

Не в сети

#3 16.07.2017 23:23:50

Re: Добавить кастомное поле к каждому элементу коллекции

Нужно вывести аналитику на страницу.

Есть таблица

WVYSZ0Dejx4.jpg

Нужно таблицей вывести
дата / кол-во посителей / кол-во просмотренных страниц

в дату попадает ип сити коунтри ос исп и тп. Как лучше вот это сделать?

За пояснение про бд отельное спасибо!

Изменено adams (16.07.2017 23:26:39)

Не в сети

#4 16.07.2017 23:29:54

Re: Добавить кастомное поле к каждому элементу коллекции

а количество посетителей - это количество уникальных ип?

Не в сети

#5 16.07.2017 23:32:23

Re: Добавить кастомное поле к каждому элементу коллекции

Да!
Количество просмотров - это всего сколько ип.

Не в сети

#6 16.07.2017 23:38:31

Re: Добавить кастомное поле к каждому элементу коллекции

SELECT count(ip) AS visits, count(DISTINCT ip) AS visitors
FROM table
WHERE date BETWEEN '2017-07-16 00:00:00' AND '2017-07-16 23:59:59'
$res = \DB::table('analytics')
    ->select(\DB::raw('count(ip) AS visits, count(DISTINCT ip) AS visitors'))
    ->whereBetween('date', [$daterangepicker_start, $daterangepicker_end])
    ->get();

Вроде так.

Не в сети

#7 16.07.2017 23:43:36

Re: Добавить кастомное поле к каждому элементу коллекции

А можно на выходе получить массив или объект
в котором есть ячейка дата / виситорс / виситс

что бы во вьювере просто форычем перебрать и вывести итоговую таблицу? я этого пытаюсь добиться

Не в сети

#8 16.07.2017 23:59:41

Re: Добавить кастомное поле к каждому элементу коллекции

а дата в каком формате? если datetime, то

$res = \DB::table('analytics')
    ->select(\DB::raw('DATE_FORMAT(date, "%Y-%m-%d") as day, COUNT(ip) AS visits, COUNT(DISTINCT ip) AS visitors'))
    ->whereBetween('date', [$daterangepicker_start, $daterangepicker_end])
    ->groupBy(\DB::raw('1'))
    ->get();

Забегая вперед по поводу GROUP BY 1, это элемент оптимизации.
https://stackoverflow.com/questions/739 … -by-1-mean

Изменено covobo (17.07.2017 00:03:22)

Не в сети

#9 17.07.2017 00:03:08

Re: Добавить кастомное поле к каждому элементу коллекции

Дата это фильтр...

в дату попадает ип сити коунтри ос исп и тп.

Не в сети

#10 17.07.2017 00:05:43

Re: Добавить кастомное поле к каждому элементу коллекции

тебе осталось только свою фильтрацию добавить

$query = \DB::table('analytics')
    ->select(\DB::raw('DATE_FORMAT(date, "%Y-%m-%d") as day, COUNT(ip) AS visits, COUNT(DISTINCT ip) AS visitors'))
    ->groupBy(\DB::raw('1'));

if ($data['date_start']) {
    $query->where('date', '>=', $data['date_start']);
}

if ($data['ip']) {
    $query->where('ip', $data['ip']):
}

if ($data['city']) {
    $query->where('city', $data['city']);
}
...etc...
$result = $query->get();

Изменено covobo (17.07.2017 00:06:56)

Не в сети

#11 17.07.2017 00:11:42

Re: Добавить кастомное поле к каждому элементу коллекции

Если честно немного не то, можно с вами списаться на емейл? если что я готов оплатить консультацию!

Не в сети

#12 17.07.2017 00:19:25

Re: Добавить кастомное поле к каждому элементу коллекции

Я передаю пост запросом переменку $stat, она будет равна к примеру country

Я делаю запрос

$data = Analytics::select($stat)->whereBetween('date', [$daterangepicker_start, $daterangepicker_end])->groupBy($stat)->get();

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

$data = [
  ['us', 10, 100],
  ['ca', 20, 300]
]

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

Изменено adams (17.07.2017 00:20:24)

Не в сети

#13 17.07.2017 00:19:53

Re: Добавить кастомное поле к каждому элементу коллекции

Я так полагаю ты хочешь группировать запрос в зависимости от пользовательского ввода?
Типа - посчитать просмотры и посетителей по городу?

Я сейчас уже собирался уходить, но все же "накидаю" тебе примерно то, что ты должен сделать.

$query = \DB::table('analytics')->groupBy(\DB::raw('1'));
if ($groupBy == 'city') {
    $query->select(\DB::raw('city as data, COUNT(ip) AS visits, COUNT(DISTINCT ip) AS visitors'));
} else if ($groupBy == 'ip' ) {
    $query->select(\DB::raw('ip as data, COUNT(ip) AS visits, COUNT(DISTINCT ip) AS visitors'));
} else if ($groupBy == 'date') {
    $query->select(\DB::raw('date as data, COUNT(ip) AS visits, COUNT(DISTINCT ip) AS visitors'));
}

...здесь код, который умеет фильтровать....
if ($filter['date_start']) {
    $query->where('date', '>=', $data['date_start']);
}

if ($filter['ip']) {
    $query->where('ip', $data['ip']):
}

if ($filter['city']) {
    $query->where('city', $data['city']);
}

$result = $query->get();

P.S. Выглядит некрасиво, но, решил, что лучше ответить сейчас, чем поздно, но красиво.

Изменено covobo (17.07.2017 00:20:34)

Не в сети

#14 17.07.2017 00:22:34

Re: Добавить кастомное поле к каждому элементу коллекции

Чучуть выше описал подробнее, разве нет дургих вариантов, кроме как писать проверки, мне показалось вы слегка не поняли что я делаю))

Не в сети

#15 17.07.2017 00:26:21

Re: Добавить кастомное поле к каждому элементу коллекции

Чучуть выше описал подробнее, разве нет дургих вариантов, кроме как писать проверки, мне показалось вы слегка не поняли что я делаю))

В общем, посчитать то, что надо - "COUNT(ip) AS visits, COUNT(DISTINCT ip) AS visitors".
Как фильтровать и группировать - уже есть примеры.
Варианты как сделать - показал, можно и по другому.
Не обязательно писать кучу if-else, я продемонстрировал вариант.

Не в сети

#16 17.07.2017 00:39:48

Re: Добавить кастомное поле к каждому элементу коллекции

$data = Analytics::selectRaw("$stat, COUNT(DISTINCT ip) AS visitors, COUNT(ip) AS visits")->whereBetween('date', [$daterangepicker_start, $daterangepicker_end])->groupBy($stat)->get();

Решил задачу!Спасибо!

Я Вам, что-то должен?

Изменено adams (17.07.2017 00:43:53)

Не в сети

#17 17.07.2017 11:13:18

Re: Добавить кастомное поле к каждому элементу коллекции

Решил задачу!Спасибо!Я Вам, что-то должен?

Очень непривычно слышать такое в СНГ комьюнити.

Нет, я здесь ради интереса)
Спасибо.

Не в сети

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