代码之家  ›  专栏  ›  技术社区  ›  Jaquarh

我怎样才能通过对拉拉维尔的股票进行分组来找到最畅销的股票呢?

  •  0
  • Jaquarh  · 技术社区  · 5 年前

    我正试图根据在该产品上创建的库存数量来选择最畅销的产品。产品的库存单位越多=销售量越大。

    我的产品列表如下:

    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');
        });
    

    我的产品目录如下:

    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');
    });
    

    以下是我迄今为止所做的努力,用雄辩的-不要太在意其他加入,只是让畅销书工作:

    $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_skus 有一个外键 product_id product_list 表列 id . 我想根据与产品ID的关系对库存单位进行分组。大多数sku被分组到单个产品ID,我想从 产品清单 桌子

    $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"
      }
    ]
    

    我想计算所有这些,所以这里,产品 身份证件 3应显示为顶部产品,其次是产品2。

    1 回复  |  直到 5 年前
        1
  •  1
  •   Mozammil    5 年前

    您可以通过子查询来实现这一点。

    $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();
    

    …这将产生与上面相同的查询。我不完全确定你的型号。你应该相应地改变它。