Подсчитайте несколько полей и сгруппируйте их в три связанные таблицы - PullRequest
1 голос
/ 13 мая 2019

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

Структуры:

imageviews
----------
-imageId
-productId
-time
-browser
-os

clicks
------
clickId
imageId
time

downloads
---------
downloadId
clickId
time

Если я использую Eloquent с активной загрузкой и группирую по двум полям, я вижу отношение «щелчок», но не могу подсчитать результаты каждой комбинации каждой пары «браузер» и «ОС».

>>> $deliveries = App\Delivery::with('clicks')->groupBy('browser','os')->get();

Я пытался объединить количество запросов с помощью Eloquent, но безуспешных результатов. Например, я добавил три модели («Просмотр изображений», «Клик», «Загрузки»), в которых я определяю отношения.

ImageView.php

<?php


namespace App;

use Illuminate\Database\Eloquent\Model;

class ImageView extends Model
{
    public $timestamps = false;
    protected $primaryKey = 'imageId';
    protected $keyType = 'string';
    public $incrementing = false;
    protected $fillable = ['imageId', 'product_id', 'time', 'browser', 'os', 'site'];


    public function clicks()
    {
        return $this->hasMany(Click::class, 'imageId', 'imageId');
    }
}

Click.php

<?php


namespace App;

use Illuminate\Database\Eloquent\Model;

class Click extends Model
{
    public $timestamps = false;
    protected $primaryKey = 'clickId';
    protected $keyType = 'string';
    public $incrementing = false;
    protected $fillable = ['deliveryId', 'clickId', 'time'];

    public function imageview()
    {
        return $this->belongsTo(App\ImageView::class, 'imageId', 'imageId');
    }

    public function downloads()
    {
        return $this->hasMany(App\Install::class, 'clickId', 'clickId');
    }
}

download.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Download extends Model
{
    public $timestamps = false;

    protected $fillable = ['downloadId', 'clickId', 'time'];

    public function click()
    {
        return $this->belongsTo(App\Install::class, 'clickId', 'clickId');
    }
}

Моя цель - создать JSON, который генерирует такой результат:

{
    "interval": {
        "start": "2018-01-07T14:30:00+0000",
        "end": "2018-01-07T18:20:00+0000" },
    "data": [ {
        "fields": {
            "browser": "Chrome", 
            "os": "Android"
        }, "stats": {
           "imageviews": 10,
           "clicks": 4,
           "downloads": 1
        }
    },
    {
        "fields": {
            "browser": "Safari",
            "os": "iOS"
         },
         "stats": {
            "imageviews": 2,
            "clicks": 1,
            "downloads": 1
         }
    },
    {
        "fields": {
            "browser": "Chrome", 
            "os": "iOS"
        }
        "stats": {
           "imageviews": 15,
           "clicks": 5,
           "downloads": 3
        } }
    ]
}

Как я могу получить это? Я рад предоставить дополнительную информацию, если это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...