如何使用 eloquent 在 laravel 中编写多个连接

Posted

技术标签:

【中文标题】如何使用 eloquent 在 laravel 中编写多个连接【英文标题】:how to write multiple join in laravel using eloquent 【发布时间】:2020-04-07 13:03:30 【问题描述】:

我正在学习 laravel。我想在 laravel 中使用 eloquent 编写以下查询:

 select b.branch_name, w.branch_work_name from branches AS b, branch_work_metadata AS w, branch_work_lookup AS bw where b.branch_id = bw.branch_id AND w.branch_work_id = bw.branch_work_id

以上查询在phpmysql中完美运行

我对每个表都有如下模型:

表:分支 --- 模型:分支

表:branch_work_metadata --- 模型:BranchWorkMetadata

表:branch_work_lookup --- 模型:BranchWorkLookup

当我尝试在 laravel 中编写上述查询时,它给了我错误

 $branch = DB::table('branches as b', 'branch_work_metadata as w', 'branch_work_lookup as bw')
               ->select('b.branch_name','w.branch_work_name')
               ->join('b.branch_id','=','bw.branch_id')
               ->join('w.branch_work_id','=','bw.branch_work_id') 
               ->get();  

上面给我错误

Illuminate\Database\QueryException
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'b.branch_id' doesn't exist (SQL: select `b`.`branch_name`, `w`.`branch_work_name` from `branches` as `b` inner join `b`.`branch_id` on `=` = `bw`.`branch_id` inner join `w`.`branch_work_id` on `=` = `bw`.`branch_work_id`)

还尝试了以下操作:

$branch = BranchWorkLookup::Join('branches.branch_id','=','branch_work_lookup.branch_id')
                ->Join('branch_work_metadata.branch_work_id','=','branch_work_lookup.branch_work_id')
                ->select(
                    'branches.branch_name',
                    'branch_work_name'
                    )
                ->get();

给出错误

Illuminate\Database\QueryException
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'branches.branch_id' doesn't exist (SQL: select `branches`.`branch_name`, `branch_work_name` from `branch_work_lookup` inner join `branches`.`branch_id` on `=` = `branch_work_lookup`.`branch_id` inner join `branch_work_metadata`.`branch_work_id` on `=` = `branch_work_lookup`.`branch_work_id`)

怎么了?无法找到解决方案。请帮忙。提前致谢。

【问题讨论】:

如果有人知道,请告诉我如何使用 eloquent 编写该查询。这对我和遇到同样问题的每个人都有帮助。 【参考方案1】:

您正在尝试将老式连接语法与 Laravel 的查询构建器使用的现代版本混合,这也是您应该使用的版本。试试这个:

$branch = DB::table('branches as b')
    ->select('b.branch_name', 'w.branch_work_name')
    ->join('branch_work_lookup as bw', 'b.branch_id', '=', 'bw.branch_id')
    ->join('branch_work_metadata as w', 'w.branch_work_id', '=', 'bw.branch_work_id')
    ->get();

明确地说,这是您应该使用的原始 MySQL 查询:

SELECT
    b.branch_name,
    w.branch_work_name
FROM branches AS b
INNER JOIN branch_work_lookup bw
    ON b.branch_id = bw.branch_id
INNER JOIN branch_work_metadata AS w
    ON w.branch_work_id = bw.branch_work_id;

【讨论】:

给我Illuminate\Database\QueryException SQLSTATE[42S22]: Column not found: 1054 Unknown column 'bw.branch_id' in 'on clause' (SQL: select `b`.`branch_name`, `w`.`branch_work_name` from `branches` as `b` inner join `branch_work_metadata` as `w` on `b`.`branch_id` = `bw`.`branch_id` inner join `branch_work_lookup` as `bw` on `w`.`branch_work_id` = `bw`.`branch_work_id`) 试试更新的答案;我最初交换了连接条件的顺序,它现在应该可以工作了。 是的。它现在工作。您能否也告诉我,如何使用 eloquent(使用模型名称)而不是查询生成器来编写它?有可能吗? 我不太懂 Eloquent 语法。 你可以看看这个教程:larashout.com/using-joins-in-laravel-eloquent-queries。而这个回复:***.com/questions/29165410/…

以上是关于如何使用 eloquent 在 laravel 中编写多个连接的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Eloquent 在 Laravel 中开始查询?

如何在 Laravel/Eloquent 中获得完整的关系

如何在 laravel 5 中使用 Eloquent 更新数据透视表

如何在 Eloquent 模型中使用 Laravel Livewire?

如何在 Laravel 4 中手动创建一个新的空 Eloquent 集合

如何使用 eloquent 在 laravel 迁移中删除 POSTGRES 表或视图?