Как я могу найти лучших продавцов, группируя складские единицы в Laravel? - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь выбрать наиболее продаваемые товары, основываясь на том, сколько единиц товара было создано для этого продукта. Чем больше единиц товара на складе = тем больше продаж.

Моя таблица product_list выглядит так:

Schema::create('product_list', function (Blueprint $table) {
    $table->increments('id');
    $table->decimal('cost', 9, 2)->default(00.00);
    $table->integer('product_category')->unsigned();            # IE Bespoke/Static/Dynamic
    $table->integer('product_type')->unsigned();                # IE Themes(Custom Or Not)/Number of pages
    $table->integer('product_score')->default(0);               # How many favourites does it have?
    $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
    $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));

    $table->index(array('product_category', 'product_type'));

    $table->foreign('product_category')->references('id')->on('product_categories');
    $table->foreign('product_type')->references('id')->on('product_types')->onDelete('cascade');
    });

Моя таблица products_skus выглядит следующим образом:

Schema::create('product_skus', function (Blueprint $table) {
    $table->increments('id');
    $table->string('reference');
    $table->integer('product_id')->unsigned();
    $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
    $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));

    $table->index(array('product_id'));

    $table->foreign('product_id')->references('id')->on('product_list')->onDelete('cascade');
});

Вот то, что я пробовал до сих пор, используя Eloquent - не слишком напрягаясь по поводу получения каких-либо других объединений в данный момент, просто заставляя работать бестселлеров:

$topSellers = DB::table('product_list')->join('product_skus', 'product_skus.product_id', '=', 'product_list.id')
                                       ->groupBy('product_skus.product_id')
                                       ->limit(5)
                                       ->get()
                                       ->all();

Что дает мне эту ошибку:

SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1055 'iezonsolutions.product_list.id' отсутствует в GROUP BY (42000)

Как я могу найти самые продаваемые вещи? Я создаю SKU для каждого product_item при его продаже, что позволяет отслеживать наиболее продаваемых товаров, а также дает пользователю уникальную возможность отслеживания.

Обновление для отображения отношений

product_skus имеет внешний ключ product_id, который относится к product_list столбцу таблицы id. Я хочу сгруппировать единицы хранения на основе отношения к идентификатору продукта. Большинство SKU сгруппированы по этому идентификатору продукта, я хочу получить их из таблицы product_list

$topSellers = DB::table('product_skus')->join('product_list', 'product_skus.product_id', '=', 'product_list.id')
                                       ->orderBy('product_skus.product_id')
                                       ->limit(5)
                                       ->get()
                                       ->all();

Теперь группирует правильные отношения, однако выводит мне

array:3 [▼
  0 => {#725 ▼
    +"id": 2
    +"reference": "A400IEZON_"
    +"product_id": 2
    +"created_at": "2019-01-16 16:37:16"
    +"updated_at": "2019-01-16 16:37:16"
    +"cost": "100.00"
    +"product_category": 1
    +"product_type": 2
    +"product_score": 0
    +"rating": 0
    +"down_payment": "10.00"
  }
  1 => {#726 ▼
    +"id": 3
    +"reference": "C400IEZON_"
    +"product_id": 3
    +"created_at": "2019-01-16 16:37:25"
    +"updated_at": "2019-01-16 16:37:25"
    +"cost": "150.00"
    +"product_category": 1
    +"product_type": 3
    +"product_score": 0
    +"rating": 0
    +"down_payment": "10.00"
  }
  2 => {#727 ▼
    +"id": 3
    +"reference": "C400IEZON_"
    +"product_id": 3
    +"created_at": "2019-01-16 16:37:25"
    +"updated_at": "2019-01-16 16:37:25"
    +"cost": "150.00"
    +"product_category": 1
    +"product_type": 3
    +"product_score": 0
    +"rating": 0
    +"down_payment": "10.00"
  }
]

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

1 Ответ

0 голосов
/ 16 января 2019

Вы можете достичь этого с помощью подзапроса.

$skus = ProductSku::selectRaw('COUNT(*)')
    ->whereColumn('product_id', 'product_list.id')
    ->getQuery();

$products = ProductList::select('*')
    ->selectSub($skus, 'skus_count')
    ->orderBy('skus_count', 'DESC')
    ->take(5)
    ->get();

Это было бы намного проще, если бы ProductList имел отношения с ProductSku. Тогда вы можете просто сделать это:

Например, в App\ProductList вы можете получить что-то вроде этого:

public function skus()
{
    return $this->hasMany(ProductSku::class);
}

.. тогда ваш запрос будет просто:

ProductList::withCount('skus') 
    ->orderBy('skus_count', 'DESC')
    ->take(5)
    ->get();

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

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