Laravel - 按多对多表关系中的透视值排序

时间:2015-07-27 08:16:20

标签: php mysql laravel pivot

我的应用程序(Laravel 5.0)有一个Products表和一个Formats表。这两个表(format_product)之间存在很多关系。一种产品可以多种形式出售。每个关系都有一个特定的价格,所以我在format_product表中添加了“price”列。

现在我正在尝试按价格对产品进行分类(是每种产品最便宜的格式价格参考值)。 还有一件事,我需要对结果进行分页。

class Product extends Model {

    public function formats()
    {
        return $this->belongsToMany('App\Format')->withPivot('price')->orderBy('pivot_price', 'asc');
    }

}

class Format extends Model {

    public function products()
    {
        return $this->belongsToMany('App\Product')->withPivot('price');
    }

}

这是format_product_pivot:

Schema::create('format_product', function(Blueprint $table) {
    $table->integer('format_id')->unsigned()->index();
    $table->foreign('format_id')->references('id')->on('formats')->onDelete('cascade');
    $table->integer('product_id')->unsigned()->index();
    $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade');
    $table->decimal('price', 8, 2);
});

例如,有这个值:

Product A - Format 1 = 15€
Product A - Format 2 = 10€
Product B - Format 1 =  8€
Product B - Format 2 = 20€
Product C - Format 3 =  5€
Product C - Format 1 =  2€

我想要这个结果:

Product C - 1 ( 2€)
Product B - 1 ( 8€)
Product A - 2 (10€)

1 个答案:

答案 0 :(得分:2)

好的,所以我通常不会将orderBy()放在我的模型中,但它不应该是一个太大的问题。您将不得不使用联接来获得所需的结果。

您可以在控制器中使用以下查询:

public function index() {
    $products = Product::join('format_product', 'format_product.product_id', '=', 'products.id')
                        ->select('products.id', 'format_product.format_id', 'format_product.price')
                        ->orderBy('format_product.price', 'asc')
                        ->paginate(25)
                        ->get();
}

您无法通过关系对产品进行排序的原因与您无法通过内部数组对多维数组进行排序的原因相同。

例如:

$array = [
    'key1' => [
        'anotherKey' => 'some value'
    ],
    'key2' => [
        'anotherKey' => 'some other value',
        'anotherKey2' => 'some other value2'
    ],
    'key3' => [
        'anotherKey' => 'yet another value'
    ]
]

您无法按anotherKey对此数组进行排序。你必须使用连接。

希望这有帮助。