【问题标题】:Laravel - Rewriting this SQL Query using relationsLaravel - 使用关系重写此 SQL 查询
【发布时间】:2016-12-26 14:33:54
【问题描述】:

免责声明:总的来说,我是 SQL 的绝对新手。

我有 2 个具有多对多关系的表,因此我创建了一个数据透视表。

表格如下:sheetsstylessheet_style

  • 我的Sheet 模型有一个styles() 方法(BelongsToMany 关系)
  • 我的Style 模型有一个sheets() 方法(BelongsToMany 关系)

我目前正在尝试编写一个请求,对于 1 个给定的 style 名称,它将检索相应的 sheets

这是我想出的:

protected function getSheetsFromStyle($style_name) {
    $style = Style::where('name', $style_name)->first();

    if($style != null) {
        $entries = \DB::table('sheet_style')->where('style_id', $style->id)->get();

        $corresp_sheet_ids = [];
        foreach($entries as $entry) {
            array_push($corresp_sheet_ids, $entry->sheet_id);
        }

        $corresp_sheets = [];
        foreach($corresp_sheet_ids as $s_id) {
            array_push($corresp_sheets, Sheet::where('id', $s_id)->first());
        }
        return $corresp_sheets;
    }
    return [];
}

但是,这似乎真的“未优化”。有没有办法只在 MySQL 中实现这一点,而不必到处创建 foreach 循环?或者也许有办法使用我设置的关系?

【问题讨论】:

    标签: mysql sql laravel


    【解决方案1】:

    除非我完全误解了,如果您的关系设置正确,您可以将所有这些简化为两行:

    $style = Style::where('name', $style_name)->first();
    return $style ? $style->sheets : [];
    

    绝对不需要循环两次来查找表格 - 这正是关系的用途! :)

    【讨论】:

    • 当我说我是一个完全的新手时,我没有撒谎:P 非常感谢,它有效 :)
    • 我很高兴它有帮助。 :)
    【解决方案2】:

    如果你有兴趣,解决这个问题的 SQL 应该是这样的 :)

    select sh.sheet_id, sh.sheet_name from sheet sh
    join sheet_style ss on (ss.sheet_id = sh.sheet_id)
    join style st on (ss.style_id = st.style_id)
    where st.style_name = 'style_name'
    

    【讨论】:

      【解决方案3】:

      试试这个

      应用/表格

      public function Style()
      {
          return $this->belongsToMany('App\Style');
      }
      

      应用/样式

      public function Sheet()
      {
          return $this->belongsToMany('App\Sheet');
      }
      

      控制器

      use App/Style
      
      protected function getSheetsFromStyle($style_name,Style $style) {
          $getStyles = $style->with('Sheet')->where('name', $style_name)
                             ->get();
          dd($getStyles);
      }
      

      【讨论】:

        猜你喜欢
        • 2020-09-18
        • 1970-01-01
        • 2014-10-13
        • 2017-01-11
        • 1970-01-01
        • 2020-01-23
        • 1970-01-01
        • 2015-08-06
        • 2017-02-26
        相关资源
        最近更新 更多