嵌套循环:间隔循环为主循环的第一次迭代带来结果

问题描述 投票:0回答:1

我正在编写一个 Laravel 代码,其中我需要在 Blade 中使用嵌套循环。

这是我的控制器

  public function show(string $id)
  {
    $transaction = Transaction::findOrFail($id);
    $subject_ids = DB::connection('transfer')
      ->table('subjects')
      ->join('transactions_subjects', 'transactions_subjects.subject_id', '=', 'subjects.id')
      ->where('transactions_subjects.transaction_id', '=',  $transaction->id)
      ->distinct()
      ->get(['subject_id', 'name', 'hours']);

    $subjects = DB::connection('transfer')
      ->table('subjects')
      ->join('transactions_subjects', 'transactions_subjects.transferable_id', '=', 'subjects.id')
      ->where('transactions_subjects.transaction_id', '=',  $transaction->id);

    return view('transfer.transactions.details', [
      'transaction'   => $transaction,
      'subject_ids'   => $subject_ids,
      'subjects'      => $subjects,
    ]);
  }

我有一个交易表,其中有一个主题 ID 和一个可转让 ID,该 ID 又与主题表关联。

还有一个 transaction_subject 表,其中包含与一个或多个主题相关的许多可转让资产。

我为每个可转移对象提供了不同的值,以便我可以使用嵌套循环遍历主题。

  @foreach ($subject_ids as $id)
    <div class="row wrapper table-responsive table text-center">
      <div class="col-2">
        <div>{{ $id->subject_id }}</div>
      </div>
      <div class="col-2">
        <div>{{ $id->hours }}</div>
      </div>
      @foreach ($subjects->where('subject_id', $id->subject_id)->get() as $subject)
        <div class="col-2">
          <div>{{ $subject->code }}</div>
        </div>
        <div class="col-2">
          <div>{{ $subject->name }}</div>
        </div>
        <div class="col-2">
          <div>{{ $subject->hours }}</div>
        </div>
        <div class="col-2"></div>
        <div class="col-2"></div>
        <div class="col-2"></div>
      @endforeach
      <hr>
    </div>
  @endforeach

在刀片文件中,我对可转移的每个不同值进行了迭代,并在嵌套循环中引入了相关主题。

但是,嵌套循环只为外循环的第一次迭代带来相关主题,并且后续行没有值。

我用 vanila PHP 编写了相同的逻辑,并且运行良好。我一定是做错了什么或者漏掉了什么。

有人可以帮我吗?

laravel laravel-blade nested-loops
1个回答
0
投票

这样修改代码:

public function show(string $id)
{
  $transaction = Transaction::with('subjects')->findOrFail($id);

  return view('transfer.transactions.details', [
    'transaction' => $transaction,
  ]);
}
@foreach ($transaction->subjects as $subject)
  <div class="row wrapper table-responsive table text-center">
    //rows
  </div>
@endforeach

在您的模型中:

public function subjects()
{
  return $this->belongsToMany(Subject::class, 'transactions_subjects', 'transaction_id', 'subject_id');
}
© www.soinside.com 2019 - 2024. All rights reserved.