在Laravel 5.1中使用链接数据库表的OrderBy

时间:2016-11-18 14:08:13

标签: php mysql laravel laravel-5

我有一个包含产品的表格,一个包含类别的表格和一个将产品链接到多个类别的表格。所有正确的外键都将它们连接在一起。当用户属于某个类别时,使用ProductToCategory模型选择此类别中的产品。

但我想要的是找到一种简单的方法,而不是将链接产品的输出循环到此类别,以按名称对产品进行排序。

我的数据库布局:

products
    id: 1; name: testing 123
    id: 2; name: testing 345
    id: 3; name: testing 567

product_categories
    id: 1; name: cat one
    id: 2; name: cat two
    id: 3; name: cat three

product_to_categories
    id: 1; product_id: 1; product_category_id: 1
    id: 2; product_id: 1; product_category_id: 2
    id: 3; product_id: 2; product_category_id: 1
    id: 4; product_id: 3; product_category_id: 1
    id: 5; product_id: 3; product_category_id: 2
    id: 6; product_id: 3; product_category_id: 3

在我的ProductCategory模型中,我有:

public function ProductToCategory() {
    return $this->hasMany('App\Models\ProductToCategory');
}

在我的ProductToCategory模型中,我有:

public function Product() {
    return $this->belongsTo('App\Models\Product', 'product_id');
}

在控制器中我有:

$linked_products = $category->ProductToCategory()->get();
foreach($linked_products as $linked_product) {
    if($linked_product->Product->is_active == 1) {
        $array[$linked_product->product_id] = $linked_product->Product);
    }

}

这为我提供了$linked_product->Product我需要的产品信息。

但是在模型中使用Eloquent方法我想在给出查询结果之前按名称订购产品。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

您似乎有many-to-many relation。您不需要ProductToCategory-Model。

相反,您需要在ProductCategory-Model:

中使用此关系
public function products()
{
    return $this->belongsToMany('App\Models\Product');
}

您的产品型号中有一个:

public function categories()
{
    return $this->belongsToMany('App\Models\ProductCategory');
}

您还可以指定数据透视表的名称(product_to_category-table)和列名称:

public function categories()
{
    $this->belongsToMany('App\Models\ProductCategory', 'table_name', 'product_id ', 'product_category_id ');
}

通过这种方式,您可以按如下方式查询:

$linked_products = $category->products()->orderBy('name')->get();