GroupBy来自Laravel 5.5中HasManyThrough通过ManyToMany关系的结果

时间:2018-07-26 17:59:42

标签: mysql laravel eloquent many-to-many laravel-5.5

我有一个复杂的关系,例如CategoryProducts之间的ManyToMany关系,而Product可以有来自不同商店(用户)的许多Inventory列表。一个Shop可以有多个Product作为变体(颜色/大小)的列表。

到目前为止一切都很好!

向访问者显示列表时,问题就开始了。我想显示一个类别下的所有列表,但不想显示同一家商店中同一产品的多个列表。相反,要从商店中选择最低的sale_price列表。

我有三个模型,关系如下:

     class Category extends Model
     {
         public function products()
         {
             return $this->belongsToMany(Product::class);
         }
     }


     class Product extends Model
     {

        public function categories()
        {
            return $this->belongsToMany(Category::class);
        }

        public function inventories()
        {
            return $this->hasMany(Inventory::class);
        }
    } 


    class Inventory extends Model
    {
        public function product()
        {
            return $this->belongsTo(Product::class);
        }

    }

表格:

    //Categories
    Schema::create('categories', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name')->unique();
    });


    //Products
    Schema::create('products', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name')->unique();
    });

    //Pivot table
    Schema::create('category_product', function (Blueprint $table) {
        $table->integer('category_id');
        $table->integer('product_id');
    });


    //Inventories
    Schema::create('inventories', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('shop_id');
        $table->integer('product_id');
        $table->string('sku', 200);
        $table->string('title');
        $table->decimal('sale_price', 10, 2);
    });

由于Laravel不提供任何manyToManyThough()关系。我在listings模型中添加了Category方法。此方法返回所有列表:

public function listings()
{
    $product_ids = $this->products()->pluck('products.id')->all();

    return Inventory::whereIn('product_id', $product_ids)->paginate(20);
}

然后我尝试了这个:

public function listings()
{
    $product_ids = $this->products()->pluck('products.id')->all();

    return Inventory::whereIn('product_id', $product_ids)->groupBy('shop_id','product_id')->paginate(20);
}

这些方法产生MySQL GroupBy错误。是的,我可以在获取所有结果后过滤结果,但这会影响分页。如何获得排序结果并保持分页能力。每天都感谢和感谢我。 :)

1 个答案:

答案 0 :(得分:1)

您可以通过“跳过” products表来创建直接关系:

public function listings() {
    return $this->belongsToMany(
        Inventory::class,
        'category_product',
        null,
        'product_id',
        null,
        'product_id'
    );
}