laravel简单查询构建器(join& where case)

时间:2015-11-12 16:52:32

标签: sql laravel join where

我有2张表(product & type)

produk table
 -id
 -kode_produk
 -nama_produk
 -id_jenis_produk

jenis table
- id
- jenis_item

我想通过查询构建器从jenis table访问数据库jenis_item 到目前为止我已经尝试了

$selectProduk = DB::table('produk')->where('id', $id)->join('jenis', 'produk.id_jenis_produk', '=', 'jenis.id')->first();

和类似的东西

$selectProduk = DB::table('produk')
                 ->join('jenis', function($join) {
                     $join->on('produk.id_jenis_item', '=', 'jenis.id')
                        ->where('produk.id', $id); // line 86 (error)
                    })->first();

但仍然因laravel logs

的消息错误而失败
exception 'ErrorException' with message 'Undefined variable: id' in C:\xampp\htdocs\itklan\app\controllers\ProdukController.php:86

我在哪儿?

@Thomas Kim

我收到另一个错误

exception 'ErrorException' with message 'Missing argument 3 for Illuminate\Database\Query\JoinClause::where(), called in C:\xampp\htdocs\itklan\app\controllers\ProdukController.php on line 86 and defined' in C:\xampp\htdocs\itklan\vendor\laravel\framework\src\Illuminate\Database\Query\JoinClause.php:87

第87行:

$selectProduk = DB::table('produk')
                        ->join('jenis', function($join) use($id) {
                            $join->on('produk.id_jenis_item', '=', 'jenis.id')
                                ->where('produk.id', $id);
                        })->first(); //line 87

1 个答案:

答案 0 :(得分:1)

这就是PHP闭包的工作方式。为了使用$id,闭包必须使用use关键字从父作用域继承变量。例如:

$selectProduk = DB::table('produk')
                ->join('jenis', function($join) use($id) { // Check this line
                    $join->on('produk.id_jenis_item', '=', 'jenis.id')
                        ->where('produk.id', '=', $id);
                })->first();
  

闭包还可以从父作用域继承变量。必须将任何此类变量传递给使用语言构造。

来源:http://php.net/manual/en/functions.anonymous.php

编辑:

此外,与Laravel的JoinClause相似,您需要具体了解您的运营商。通常,您可以这样做:

->where('produk.id', $id);

Laravel为您添加了一个相同的运算符。但是,对于join子句,这将不起作用。您需要指定运算符。

->where('produk.id', '=', $id);