【问题标题】:How to join three tables in laravel eloquent如何在 laravel eloquent 中加入三个表
【发布时间】:2021-04-30 22:39:09
【问题描述】:

我想加入三个表: 部分表: 段id 文本 强悍

问题表: 问题ID 问题 强大的 段号

选项表: 选项ID 选项 问号

我想获取 formid=x 的所有部分(例如)以及与 sectionid 相关的问题以及与 questionid 相关的选项。

               $data=Section::with('questions','options')
                            ->where('formId',$formId)
                            ->orderBy('sectionid')
                            ->get()
                            ->toJson();

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:

    我在我的 Section 模型中创建了两个关系。一种是将Section模型加入Question模型,另一种是通过Question模型将Section模型加入Option模型。

    class Section extends Model
    {
      use HasFactory;
      protected $primaryKey='sectionid';
      public function options(){
          return $this->hasManyThrough(Option::class,Question::class,'sectionid','questionid');
    
    }
    public function questions(){
        return $this->hasMany(Question::class,'sectionid');
    }
    

    }

    我的控制器:

                $data=Section::with('questions','options')
                                ->where('formId',$formId)
                                ->orderBy('sectionid')
                                ->get()
                                ->toJson();
    

    它工作正常:)

    【讨论】:

      【解决方案2】:

      Laravel 文档:https://laravel.com/docs/8.x/queries#joins

      根据需要:

      $data = Section::where('formid', x)
                  ->join('questions', 'sections.sectionid', '=', 'questions.sectionid')
                  ->join('options', 'options.optionid', '=', 'questions.optionid')
                  ->select('sections.*', 'questions.question as question', 'options.option as option')
                  ->get();
      

      注意事项:

      1. 不要从所有表中获取 *,在大多数情况下,您可能会遇到不明确的列错误
      2. 您的编码风格不遵循惯例,这是非常糟糕的做法。遵循惯例在很多方面都有帮助。

      【讨论】:

      • 谢谢。我找到了解决方案并回答了我的问题。@Psycho
      • 您的问题是关于 join 的,而您的答案与此相去甚远。无论如何,建议您关注 laravel docs
      猜你喜欢
      • 2016-04-03
      • 2016-01-20
      • 2019-10-06
      • 1970-01-01
      • 1970-01-01
      • 2019-10-03
      • 1970-01-01
      • 1970-01-01
      • 2020-10-25
      相关资源
      最近更新 更多