Laravel:三张表与关系来获取数据

时间:2018-05-01 06:46:02

标签: laravel laravel-5.5

我的应用中有一个3表。productscategoryattributes 产品hasMany类别和类别有很多属性关系。

我希望以json格式获取所有products Category详细信息和catgoey attributes详细信息。我该怎么做?

目前我在我的控制器中尝试使用此功能:

public function index()
{
    $productDetails = Product::all();
    if(!empty($productDetails)) {
        foreach ($productDetails as $key => $value) {
            //print_r($value->id."</br>");
        }
    }
}

我想要的输出:

       {
       "productInformation": {
            "id": 1,
            "name": "productone",
            "status": "Active",
            "CategoryDetails": [
                {
                    "id": 1,
                    "product_id": 1,
                    "categoryTitle": "categoryone",
                    "attribute" : [
                        {
                            "id": 1,
                            "product_id": 1,
                            "category_id": 1,
                            "title": "attrib-title-one",
                        },          
                        {
                            "id": 2,
                            "product_id": 1,
                            "category_id": 1,
                            "title": "attrib-title-two",
                        },
                    ]
                }
            ]
        }
    }

关系:

categories

$table->foreign('product_id')->references('id')->on('products');

attributes表上:

 $table->foreign('product_id')->references('id')->on('products');
 $table->foreign('category_id')->references('id')->on('categories');

我该怎么做?

3 个答案:

答案 0 :(得分:2)

产品型号

public function categories(){
return $this->hasMany('App\Category','product_id');
}

类别模型

public function attributes(){
return $this->hasMany('App\Attribute','cat_id');
}

控制器

public function index()
{
    $productDetails = Product::with('catgories.attributes')->get();
    if(!empty($productDetails)) {
        $jsonData = json_encode($productDetails->toArray());
    }
}

答案 1 :(得分:0)

您可以在不同类别的模型中定义您的关系。属性,需要在产品模型中定义一个hasMany关系类别(命名类别),然后另一个在类别(命名属性)中有多个属性的模型。之后,您可以按照此过程准备数据数组

$productDetails = Product::all();
    if(!empty($productDetails)) {
        foreach ($productDetails as $key => $value) {  
            $productDetails[$key]['categorieDetails'] = $productDetails[$key]->categories;
         foreach ($productDetails[$key]['categorieDetails'] as $key2 => $value2) {  
            $productDetails[$key]['categorieDetails'][$key2]['
             attribute'] = $productDetails[$key]->categorieDetails[$key2]->attributes;

         }
        }

    }

然后你可以使用json_encode来生成你的json数据

答案 2 :(得分:0)

在您的控制器中

alias pytest2="python ~/.local/lib/python2.7/site-packages/pytest.py"
alias pytest3="python3 ~/.local/lib/python3.6/site-packages/pytest.py"