【问题标题】:How to join same table multiple times in Laravel?如何在 Laravel 中多次加入同一张表?
【发布时间】:2021-03-29 13:30:33
【问题描述】:

我有表用户、用户特征和特征。我想知道的是,最简单、最有效的方式是显示以某种方式使用前 5 个特征排序的用户列表。(我正在使用 Laravel 8 和 SQL)

用户 : (id, name, .... ) user_traits : (id, user_id, trait_id, trait_order, trait_importance, ...) 特征 : (id, trait_name, trait_value, ....)

我正在寻找的结果类似于:(id, name, trait_name1, trait_value1, trait_name2, trait_value2, trait_name3, trait_value3, trait_name4, trait_value4, trait_name5, trait_value5);

当前代码:

$users = DB::table('users')->where(...)
            ->leftJoin('user_traits as trait1', function($join){
                    $join->on('trait1.user_id', '=', 'users.id')
                        ->where('trait1.trait_order', 1);
                }
            )
            ->leftJoin('user_traits as trait2', function($join){
                    $join->on('trait2.user_id', '=', 'users.id')
                        ->where('trait1.trait_order', 2);
                }
            ).... up to 5
            ->leftJoin('traits as actualtrait1', function($join){
                $join->on('actualtrait1.id', '=', 'trait1.trait_id');
                }
            )
            ->leftJoin('traits as actualtrait2', function($join){
                $join->on('actualtrait2.id', '=', 'trait2.trait_id');
                }
            )....up to 5

欢迎任何帮助,并在此先感谢您。

【问题讨论】:

  • 您遇到了什么错误?你的尝试有问题​​吗?
  • 没有错误,只是执行时间非常慢。 (这只是更大查询的一部分,但我设法弄清楚这部分是整个查询的瓶颈)
  • 看起来你正在做一个“pivot”并且框架正在阻碍。使用 case 表达式而不是一堆 Join。查看添加的标签。

标签: php mysql laravel performance pivot-table


【解决方案1】:

例如,您想在连接中使用两次颜色表,您可以像这样使用第一次表名称将颜色更改为 xc,第二次将颜色更改为 ic

DB::table('vehicles')
->join('colors as xc', 'vehicles.color', '=', 'xc.id')
->join('colors as ic', 'vehicles.interior_color', '=', 'ic.id')
->select('vehicles.*', 'xc.name as xcolor','ic.name as icolor')
->where('vehicles.id',$id)
->first();

【讨论】:

    【解决方案2】:

    你可以使用 laravel 关系和预加载

    在用户模型中添加

    public function traits()
    {
      return $this->belongToMany(Trait::Class,'user_traits');
    }
    

    这将返回与用户关联的所有特征

    那么你可以做类似的事情

    $users = User::with(['traits' => function($query) {
        $query->take(5);
    }])->get();
    

    【讨论】:

      猜你喜欢
      • 2018-07-21
      • 1970-01-01
      • 2015-05-12
      • 2020-03-24
      • 1970-01-01
      • 2015-04-04
      • 2014-07-12
      • 2020-09-08
      • 2014-03-05
      相关资源
      最近更新 更多