繁体   English   中英

仅使用一个 foreach 循环从 Laravel 中的 pivot 表中检索数据

[英]Retrieving data from pivot table in Laravel only using one foreach loop

我为用户、班次、模式创建了 3 路 pivot 表。 它被称为 pattern_shift_user。

[pattern_shift_user.][1]

Schema::create('pattern_shift_user', function (Blueprint $table) {
            //$table->primary(['pattern_id', 'shift_id', 'user_id']);
            $table->unsignedBigInteger('pattern_id');
            $table->unsignedBigInteger('shift_id');
            $table->unsignedBigInteger('user_id');
            $table->timestamps();

            $table->foreign('shift_id')->references('id')->on('shifts')->onDelete('cascade')->onUpdate('cascade');

            $table->foreign('pattern_id')->references('id')->on('patterns')->onDelete('cascade')->onUpdate('cascade');

            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade')->onUpdate('cascade');
        });

它通过多对多关系引用三个模型 这里是用户 model 的视图,它链接模式 model 和移位 model [用户模型][2]

public function patterns()
    {
        return $this->belongsToMany('App\Pattern', 'pattern_shift_user')->withPivot('shift_id');
    }

    public function shifts()
    {
        return $this->belongsToMany('App\Shift', 'pattern_shift_user')->withPivot('pattern_id');
    }

我对每个 model 都做了同样的事情,它似乎工作,

我现在遇到的问题是将信息放入 Laravel 的表格中。 我想要 3 列标题为 DATE/DAY、SHIFT、STATION。

我可以获得所有我想显示的信息。 但是,我无法将信息分成列,因为每个循环使用多个表来引用不同的表,这是我认为的 Controller; 我正在使用索引 [控制器索引][3]

public function index()

    {
$user = Auth::user();
        $testUser = User::all();
        $shift = Shift::all();
        $pattern = Pattern::all();


        return view('layouts/timesheet/index', ['user' => $user, 'shift' => $shift, 'pattern' => $pattern, 'testUser' => $testUser]);
    }

然后在刀片文件中(我玩过这个负载),它目前看起来像这样

[Index.blade 文件夹][4]

<table class="table table-sm table-success">

                <tr>
                    <th scope="col">DATE/DAY</th>
                    <th scope="col">SHIFT</th>
                    <th scope="col">STATION</th>
                </tr>

                <tbody class="table-light">
                    @foreach (Auth::user()->patterns as $patternUser)
                        @foreach ($user->shifts as $shiftUser)

                            <tr>
                                <td>{{ $patternUser['day_of_week'] }}</td>
                                <td>{{ $shiftUser['Name'] }}</td>
                            </tr>
                        @endforeach
                    @endforeach

                </tbody>
            </table>

我可以让我的日期和班次全部显示在 DATE/DAY 列下,或者我可以让 7 个星期一、7 个星期二等显示在 DATE/DAY 列和 SHIFT 列中; 7 个狗屎会一直循环,所以我有 7x7 的班次列表,

我对此非常了解,而且我不太擅长解释,所以如果我可以提供更多信息,请告诉我。

感谢您的任何帮助

(我还没有添加站点,因为我发现只有两列已经够难了。最终,我需要创建一个包含更多列的更大表格,所以我只想先从小范围内了解这一点)

编辑以包括更新的模型,

用户 Model每个用户将有一个模式,但将获得许多班次(因为有时他们会在模式之外获得额外的班次)

[用户模型][1]

public function patterns()
    {
        return $this->belongsToMany('App\Pattern', 'pattern_shift_user')->withPivot('pattern_id');
    }

    public function shifts()
    {
        return $this->belongsToMany('App\Shift', 'pattern_shift_user')->withPivot('shift_id');
    }

模式 Model ,这只是一个显示日期、星期几的表格,如果银行假期突出显示,它将附加许多班次,并且将有许多用户使用相同的模式。

    class Pattern extends Model
{
    public function shifts()
    {
        return $this->belongsToMany('App\Shift', 'pattern_shift_user')->withPivot('shift_id');
    }

    public function users()
    {
        return $this->belongsToMany('App\User', 'pattern_shift_user')->withPivot('user_id');
    }
}

班次 model (这只是每个班次的次数,大约有 100 个)属于许多模式,许多用户可以有相同的班次

class Shift extends Model
{
    public function patterns()
    {
        return $this->belongsToMany('App\Pattern', 'pattern_shift_user')->withPivot('pattern_id');
    }

    public function user()
    {
        return $this->belongsToMany('App\User', 'pattern_shift_user')->withPivot('user_id');
    }
}

我有一个想法,首先,你需要坚持一种关系。

假设模式是层次结构的顶部,因此您只能从 controller 返回$patterns

public function index()
    {
        $patterns = Pattern::all();
        return view('layouts/timesheet/index', ['pattern' => $pattern]);
    }

然后,在视图内部,这更像是分层遍历关系的伪代码,例如:

    foreach ( $patterns as $pattern)
    
       // print all the pattern data like pattern[day_of_week] etc..
    
          foreach($pattern->shifts as $shift)
    
             // print all the shift data like shift[name] etc..
    
                foreach ($shift->users as $user)
    
                   // print all the shift data like user[name] etc.. 

                @endforeach
          @endforeach
   @endforeach

这是我能想到的逻辑,您可以用您认为数据层次结构的顶部替换模式,并调整伪的 rest 以很好地打印数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM