Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Laravel - join closure does not work with table reference

I am stuck at a mysql join query.

I currently have the following:

    $query = DB::table('packages')
        ->join('assigned_packages', function($join) use($id)
        {
            $join->on('packages.id', '=', 'assigned_packages.registered_package_id')
                ->where('assigned_packages.customer_id', '=', $id);
        })
        ->join('registered_packages', function($join)
        {
            $join->on('packages.id', '=', 'registered_packages.id')
                ->where('registered_packages.id', '=', 1);
        });

This works fine, but as you can see i have a hardcoded 1:

->where('registered_packages.id', '=', 1);

This 1 should be replaced with the value from the table assigned_packages and the column registered_package_id. I tried

    $query = DB::table('packages')
        ->join('assigned_packages', function($join) use($id)
        {
            $join->on('packages.id', '=', 'assigned_packages.registered_package_id')
                ->where('assigned_packages.customer_id', '=', $id);
        })
        ->join('registered_packages', function($join)
        {
            $join->on('packages.id', '=', 'registered_packages.id')
                ->where('registered_packages.id', '=', 'assigned_packages.registered_package_id');
        });

But that does not work. What am I doing wrong? I guess i need the result from the first join for the second one. But how can I do that?

dd(DB::getQueryLog()); 

outputs:

array(2) {
  [0]=>
  array(3) {
    ["query"]=>
    string(48) "select * from `customers` where `id` = ? limit 1"
    ["bindings"]=>
    array(1) {
      [0]=>
      string(2) "45"
    }
    ["time"]=>
    float(0.65)
  }
  [1]=>
  array(3) {
    ["query"]=>
    string(278) "select * from `packages` inner join `assigned_packages` on `packages`.`id` = `assigned_packages`.`registered_package_id` and `assigned_packages`.`customer_id` = ? inner join `registered_packages` on `packages`.`id` = `registered_packages`.`id` and `registered_packages`.`id` = ?"
    ["bindings"]=>
    array(2) {
      [0]=>
      string(2) "45"
      [1]=>
      string(39) "assigned_packages.registered_package_id"
    }
    ["time"]=>
    float(0.9)
  }
}
like image 278
TheNiceGuy Avatar asked Mar 02 '26 11:03

TheNiceGuy


1 Answers

Your join closure requires either DB::raw like suggested, or the method that is intended for it on:

->join('registered_packages', function($join)
{
    $join->on('packages.id', '=', 'registered_packages.id')
       ->on('registered_packages.id', '=', 'assigned_packages.registered_package_id');
});

where on joins is used only for values passed to the query.

like image 71
Jarek Tkaczyk Avatar answered Mar 05 '26 01:03

Jarek Tkaczyk



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!