Laravel - join闭包不适用于表引用

时间:2014-09-14 23:19:08

标签: php mysql laravel laravel-4

我遇到了mysql连接查询。

我目前有以下内容:

    $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);
        });

这很好用,但你可以看到我有一个硬编码 1

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

1 应替换为表 assigned_pa​​ckages registered_pa​​ckage_id 列中的值。我试过了

    $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');
        });

但这不起作用。我究竟做错了什么?我想我需要第一次加入的结果。但是我该怎么做呢?

dd(DB::getQueryLog()); 

输出:

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)
  }
}

2 个答案:

答案 0 :(得分:3)

您的加入关闭需要DB::raw之类的建议,或者针对它的方法on

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

where仅用于传递给查询的值。

答案 1 :(得分:0)

where中,Laravel将最后一个参数视为文字字符串,而不是表引用。因此,最终查询尝试将registered_packages.id列与文字字符串" assigned_pa​​ckages.registered_pa​​ckage_id" 进行匹配。

要将where与表格引用结合使用,您需要使用DB::raw指示Laravel按照您的意思行事#34;

$join->
    on('packages.id', '=', 'registered_packages.id')->
    where('registered_packages.id', '=', \DB::raw('assigned_packages.registered_package_id'))
;