提问者:小点点

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


我已经为用户、移位、模式创建了三向透视表。它称为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');
        });

它通过多对多的关系来引用这三个模型这里是用户模型的视图,它链接了模式模型和shift模型[user 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');
    }

我对每个模型都做了同样的操作,

我现在遇到的问题是将信息放入Laravel的表中。我想要3列标题日期/天,班次,站。

我可以得到我想要显示的所有信息。但是,我无法将信息分成多个列,因为我使用多个循环来引用不同的表,这是我的视图的控制器;我正在使用索引[控制器索引][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>

我可以将我的日期和班次全部显示在日期/天栏下,或者我可以将7个星期一,7个星期二等显示在日期/天栏和班次栏中;这7个shit会一直循环,所以我有7x7的轮班列表,

我对此有很大的了解,我不太擅长解释,所以如果有更多的信息我可以提供,请让我知道。

谢谢你的帮助

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

编辑以包括更新的模型,

用户模型一个用户将有一个模式,但将被赋予许多轮班(因为有时他们会在模式之外获得额外的轮班)

[用户模型][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');
    }

模式模型,这只是一个简单的表,显示日期,星期,突出显示如果银行假日,它将有许多班次附加,将有许多用户在同一模式。

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

轮班模型(这只是每次轮班的次数,大约有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');
    }
}

共1个答案

匿名用户

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

假设模式是层次结构的顶部,因此只能从控制器返回$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

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