简体   繁体   English

laravel 在条件下加入子查询

[英]laravel join subquery on condition

i have two kind of product.我有两种产品。 game and game-time .游戏游戏时间

in my code.在我的代码中。 item_id column of order_items table, represents the id of target product (may be id of game_codes or game_time_codes ) order_items表的item_id列,表示目标产品的 id(可以是game_codesgame_time_codes的 id)

and product_type_id represents the id of product kind (number 1 for gameCode and 2 for gametime )并且product_type_id代表产品种类的 id(数字 1 代表 gameCode 和 2 代表 gametime )

in my code im trying to show specific user orders with purchased items info.在我的代码中,我试图显示带有购买项目信息的特定用户订单。

i should join game_codes when if product_type_id is 1如果 product_type_id 为 1,我应该加入game_codes

and join game_time_codes when if product_type_id is 2如果 product_type_id 为 2,则加入game_time_codes

i wrote this query but it return null.我写了这个查询,但它返回 null。 how can i fix this?我怎样才能解决这个问题?

$joinGCSub = DB::table("game_codes")->where("user_id", 1)->where("sold", 1);
$joinGTSub = DB::table("game_time_codes")->where("user_id", 1)->where("sold", 1);

   $orders = DB::table('orders')
      ->leftJoin("order_items", "orders.id", "=", "order_items.order_id")
      ->leftJoin("product_types", "order_items.product_type_id", "=", "product_types.id")
      ->joinSub($joinGCSub, "gc" , function ($join){
         $join->on('order_items.item_id', "=", "gc.id")->where("product_types.id", 1);
      })->joinSub($joinGTSub, "gt", function($join) {
         $join->on('order_items.item_id', "=", "gt.id")->where("product_types.id", 2);
      })
      ->where("orders.user_id", 1)
      ->get();


   dd($orders);

you can see tables structure below您可以在下面看到表格结构

order TABLE订购表

id | user_id | .... etc

order_items table TABLE order_items 表 TABLE

id | order_id | product_type_id | item_id ...etc

game_codes TABLE游戏代码表

id | code | user_id | sold ... etc

game_time_codes TABLE游戏时间代码表

id | code | user_id | sold ...etc

Can write like below:可以这样写:

$joinGCSub = DB::table("game_codes")->where("user_id", 1)->where("sold", 1);
    $joinGTSub = DB::table("game_time_codes")->where("user_id", 1)->where("sold", 1);

    $query = DB::table('orders')
        ->leftJoin("order_items", "orders.id", "=", "order_items.order_id")
        ->leftJoin("product_types", "order_items.product_type_id", "=", "product_types.id");
    if ($product_type_id == 1)
        $query->joinSub($joinGCSub, "gc", function ($join) {
            $join->on('order_items.item_id', "=", "gc.id")->where("product_types.id", 1);
        });
    if ($product_type_id == 2)
        $query->joinSub($joinGTSub, "gt", function ($join) {
            $join->on('order_items.item_id', "=", "gt.id")->where("product_types.id", 2);
        });

    $orders = $query->where("orders.user_id", 1)
        ->get();


    dd($orders);

But it's better to use whereExist但最好使用whereExist

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM