Laravel - 使用关系重写此SQL查询

时间:2016-08-19 12:18:50

标签: mysql sql laravel

  

免责声明:我一般都是SQL的绝对新手。

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

表格如下:样式 sheet_style

  • 我的Sheet模型采用styles()方法(BelongsToMany关系)
  • 我的Style模型采用sheets()方法(BelongsToMany关系)

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

以下是我提出的建议:

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循环?或者是否有办法使用我设定的关系?

3 个答案:

答案 0 :(得分:1)

除非我完全误解,否则如果你的关系设置得当,你可以把所有这些都归结为两行:

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

完全没有必要循环两次才能找到工作表 - 这正是关系的用途! :)

答案 1 :(得分:1)

如果您感兴趣,解决此问题的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'

答案 2 :(得分:0)

试试这个

应用/表

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);
}