Laravel加入包括没有比赛的地方

时间:2015-03-26 20:11:46

标签: php mysql database laravel

我有一个像这样的表格布局:

products
    id
    productname

product_weights
    id
    productid
    weight

product_flavours
    id
    productid
    flavour

我正在尝试生成所有可能的产品变体列表。有些产品的尺寸没有变化,有些产品没有风味变化,有些产品兼而有之。我目前的想法是使用连接。到目前为止我的查询:

DB::table('product_weights')
        ->join('products', 'products.id', '=', 'product_weights.prodid')
        ->select('product_weights.value', 'products.productname')
        ->get();

这给了一些有用的东西,var_dump给出了:

[{"value":"1kg","productname":"Item 1"},{"value":"2.1kg","productname":"Item 2"},{"value":"250g","productname":"Item 3"},{"value":"1kg","productname":"Item 3"}

问题是不会返回没有重量变化的产品item 5。当然,我也需要建立口味。

然后我想制作一个类似{'项目1 1kg','项目2 2.1kg','项目3 250g',&#39 ;项目3 1kg'}

有什么想法吗?我有点觉得我做错了。帮助将不胜感激!

更新:感谢下面的评论,leftJoin取得了一些进展。我可以产生重量或味道的所需结果,但不能同时产生两者。现在的代码是:

$product_join_weights = DB::table('products')
    ->leftJoin('product_weights', 'products.id', '=', 'product_weights.prodid')
    ->select('products.productname', 'product_weights.value')
    ->get();

$product_join_flavour = DB::table('products')
    ->leftJoin('product_flavours', 'products.id', '=', 'productattributes.prodid')
    ->select('products.productname', 'product_flavours.value')
    ->get();

任何想法如何结合起来?

2 个答案:

答案 0 :(得分:2)

为什么不将连接链接在一起,而不是将两个数组组合在一起?

 $product_join = DB::table('products')
        ->leftJoin('product_weights', 'products.id', '=', 'product_weights.prodid')
        ->leftJoin('product_flavours', 'products.id', '=', 'productattributes.prodid')
        ->select('products.productname', 'product_flavours.value', 'products.productname', 'product_weights.value')
        ->get();
  

Left Joins从table1获取完整记录集,其中包含   匹配table2中的记录。该   如果不进行匹配,则右侧的结果为NULL。

http://www.w3resource.com/sql/joins/perform-a-left-join.php

答案 1 :(得分:1)

我认为你可以简单地将左连接加倍......

类似的东西:

$product_weights_and_flavours  = DB::table('products')
   ->leftJoin('product_weights', 'products.id', '=', 'product_weights.prodid')
   ->leftJoin('product_flavours', 'products.id', '=', 'productattributes.prodid')
   ->select('products.productname', 'product_weights.value', 'product_flavours.value')
   ->get();