【问题标题】:Laravel - join closure does not work with table referenceLaravel - 连接闭包不适用于表引用
【发布时间】:2014-11-08 10:38:39
【问题描述】:

我被 mysql join 查询卡住了。

我目前有以下:

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

【问题讨论】:

  • 当您说第二个“不起作用”时,您会得到什么具体错误?另外,请在运行此查询后执行dd(\DB::getQueryLog()) 并粘贴结果。
  • 它根本不返回任何东西。我已经用日志更新了这个问题。谢谢。

标签: php mysql laravel laravel-4


【解决方案1】:

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

要将where 与表引用一起使用,您需要使用DB::raw 指示Laravel“按你的意思做”:

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

【讨论】:

  • 非常感谢,我更喜欢上面的解决方案:)
【解决方案2】:

您的连接闭包需要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 on joins 仅用于传递给查询的值。

【讨论】:

  • 是的,这是首选方法!
猜你喜欢
  • 1970-01-01
  • 2023-03-18
  • 2018-11-24
  • 2016-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多