Как отобразить дочерние элементы из дочерней таблицы на странице индекса родителей?

#php #laravel #eloquent #model #controller

#php #laravel #красноречивый #Модель #контроллер

Вопрос:

У меня есть модель банка, в которой есть поля ‘bank_name’, ‘account_name’ и ‘balance’. Другая модель транзакции заключается в том, что пользователь сначала выбирает банк и вводит opening_balance и transaction_amount, а closing_balance, который является «начальным балансом — transaction_amount» (-, в зависимости от дебета / кредита), становится «балансом» в модели банка. Я хочу показать баланс в определенном банке на странице bank.index, взяв closing_balance из таблицы транзакций. Я застрял здесь. Пока у меня есть:

Модель банка:

 protected $fillable=['bank_name','account_name'];

public function transactions()
{
    return $this->hasMany('AppTransaction');
}
  

Модель транзакции:

 protected $fillable = ['bank_id','opening_balance','transaction_amount','isdebit','closing_balance'];

public function bank()
{
    return $this->belongsTo('AppBank');
}
  

BankController:

 public function index() 
{ $banks = Bank::all(); 
//$bal_1 = Bank::find(1)->transactions()->latest()->first(); 
// I can show the balance in bank which has id 1 by this manually.
 return view('bank.index', compact('banks','bal_1')); 
}
  

Контроллер транзакций:

 public function index() 
{ $transactions = Transaction::all(); 
return view('transaction.index',compact('transactions')); 
}
  

Страница Bank.index

 <table class="table">
    <thead>
      <tr>
        <th scope="col">#</th>
        <th scope="col">Bank Name</th>
        <th scope="col">Account Name</th>
        <th scope="col">Balance</th>
      </tr>
    </thead>
    <tbody>
    @foreach($banks as $i=>$bank)
      <tr>
        <th scope="row">{{  $i}}</th>
        <td>{{$bank->bank_name}}</td>
        <td>{{$bank->account_name}}</td>
        <td>{{$bal_1->closing_balance}}</td>
      </tr>
     @endforeach
    </tbody>
  </table>
  

Ответ №1:

Вы можете определить другое отношение в модели банка, которое дает вам один объект модели вместо массива, подобного этому :

 public function transaction()
{
  return $this->hasOne('AppTransaction');
}
  

Затем вы можете использовать это отношение в своем представлении bank.index :

 <td>{{$bank->transaction->closing_balance}}</td>
  

Комментарии:

1. transaction() — это простое отношение, поэтому вы можете добавить к нему области: latest() , OrderBy («что-то») …… и т. Д

2. если я добавлю ваши два комментария, то это ответ, который мне был нужен. верните $this-> hasOne(‘App Transaction’)-> latest(); Очень признателен. большое спасибо.