【问题标题】:I'd like to know if there would be best approach using laravel in making join query我想知道是否有使用 laravel 进行连接查询的最佳方法
【发布时间】:2017-10-30 09:28:38
【问题描述】:

现在我正在使用这个基本的 sql 查询在三个表中进行连接查询

select `modules`.`id`, `sub_modules`.`id` AS `sub_module_id`, `sub_modules`.`name`
from `module_groups`
inner join `positions` on `positions`.`id` = `module_groups`.`position_id`
inner join `modules` on `modules`.`id` = `module_groups`.`module_id`
inner join `sub_modules` on `sub_modules`.`module_id` = `modules`.`id`
where `positions`.`id` = 1

我想知道使用 laravel eloquent 是否最好

到目前为止我已经尝试过了

$module = new ModuleGroup();
$name   = $module
  ->select('modules.id as modules_id', 'sub_modules.id as sub_modules_id', 'sub_modules.name as sub_module_name')
  ->join('positions', 'positions.id','=','module_groups.position_id')
  ->join('modules', 'modules.id','=','module_groups.module_id')
  ->join('sub_modules', 'sub_modules.module_id','=','modules.id')
  ->where('positions.id', '=', 1)
  ->get();

它有效,但我想知道是否有使用 laravel 的最佳方法。

你能给我吗?

【问题讨论】:

  • Laravel 最好的方法是使用 Laravel 关系方式。它更容易,更快。看这里laravel.com/docs/5.4/eloquent-relationships
  • 我不是 Laravel 专家,但您当前的尝试似乎完全代表了原始的连接系列。也许更大的问题是您是否在表中设置了索引以使连接快速。
  • @Qazi 关系对于 Laravel 来说是方便且惯用的,但肯定不会更快 - 加载每个关系都需要它自己的查询。在这种特殊情况下,必须进行 4 次查询以获取具有关系的必要组。单一且适当的原始查询会更高效。

标签: php mysql laravel join


【解决方案1】:

您最好坚持使用查询生成器,而不是根据您的查询使用 eloquent。此外,您还有一个仅用于 module_groups 并执行原始连接的模型,这不是很有说服力。

您可以使用如下所示的查询生成器进行 sql 查询。

$result = \DB::table('module_groups')
    ->join('positions', 'positions.id', '=', 'module_groups.position_id')
    ->join('modules', 'modules.id','=', 'module_groups.module_id')
    ->join('sub_modules', 'sub_modules.module_id', '=', 'modules.id')
    ->where('positions.id', 1)
    ->selectRaw('modules.id as modules_id, sub_modules.id as sub_modules_id, sub_modules.name as sub_module_name')
    ->get();

如果您真的只想使用 eloquent,那么您需要为所有表定义模型并声明它们的关系。从你的sql查询中的关系来看,雄辩的方式如下所示。

$result = ModuleGroup::whereHas('positions', function ($query) {
        $query->where('id', 1);
    })
    ->with('positions', 'modules.subModules')
    ->selectRaw('modules.id as modules_id, sub_modules.id as sub_modules_id, sub_modules.name as sub_module_name')
    ->get();

【讨论】:

    猜你喜欢
    • 2019-05-25
    • 2015-01-01
    • 2017-11-01
    • 2021-11-04
    • 2020-04-23
    • 1970-01-01
    • 2021-01-30
    • 2010-09-30
    • 1970-01-01
    相关资源
    最近更新 更多