当前位置: 首页 > 知识库问答 >
问题:

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

陈嘉荣
2023-03-14

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

汪典
2023-03-14

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

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

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

 类似资料:
  • 问题是我有表格,我想得到它的所有成员。 我创建了一个表透视分组,它从表表单中检索form_id,并从表用户中user_id。但是当我试图检索信息时,我得到了这个:尝试读取bool上的属性“firstname”(视图:/.../资源/视图/分组/list.blade.php) 在我的模型中,我有:窗体: 用户: list.blade.php($表单对应于我之前在所有表单中创建的一个表单):

  • 我有下面的表格,我想检索每个喜欢评论的用户喜欢的评论的数量(类似于Instagram评论,任何人都可以喜欢其他用户的评论) 它用于保存评论链接,看起来像Instagram评论,任何用户都可以喜欢其他用户的评论。 这是我的用户模型代码: 以下是我的Ask模型代码: 这是我的用户模型代码: 这是我的评论模型代码: 我想用他们的评论检索最新的ask,包括评论的数量和数据** 我使用了这个代码,但它显示错

  • 因此,我试图在和之间建立关系,所有工作都是在创建时连接起来的,但我不知道当我想按特定的角色或配置文件列出用户时如何过滤掉。 下面是我现在拥有的一个表结构。每个表与其模型相对应,因此表具有模型表具有模型并且有一个数据透视表将用户与角色连接起来。 这将是角色表 这将是用户角色的透视表 这通常是用户表 所以如果我要列出所有帐户,这非常简单,因为我将使用 如果我想通过特定的名称或电子邮件筛选用户,我只需要

  • 我正在尝试使用复选框进行标记删除。假设用户有大约10个产品,每个产品都有3个不同的标签。 当前用户只能删除单个标记。每次标记删除后,页面刷新,他可以删除另一个标记。这不是真正的用户友好。这就是为什么我尝试对标记进行多重选择,并在单击一个按钮时删除所有选定的标记。 这就是它现在的样子: 我的问题是我需要产品id标签id来分离它们。 如果按delete(删除)按钮,则会将此数据传递到控制器: 主要的问

  • 这是我在控制器中的getIndex()函数中的东西 所以我希望从循环中获取所有类别名称。 但是,例如,如果我希望通过在视图中执行此操作来获得结果 结果是 > 对象(类别)169(20){[“可填充”:受保护]= 字符串(3)“foo1” 第一个结果从哪里来,我如何摆脱它?谢谢!

  • 从Laravel的foreach循环获取错误消息: 我的foreach循环是: 我的控制器是: