создание запроса из других таблиц с идентификатором основной таблицы в laravel - PullRequest
1 голос
/ 02 ноября 2019

Извинения за заголовок. Я действительно не уверен, как правильно назвать название исходя из моей ситуации. Я новичок в кодировании, поэтому я не знаком с правильной терминологией.

ниже приведены таблицы, над которыми я сейчас работаю.

enter image description here

Я отображаю детали из таблицы loan_application. Я могу включить в свой @foreach loan_durations и пользователей, но я понял, что мне нужно также включить СУММУ AMOUNT из таблицы loan_interests и СУММУ AMOUNT из КРЕДИТНЫХ ШТРАКОВ, которые вызывают у меня головную боль, потому что я не могу их вытащить,

МОДЕЛЬ ЗАЯВКИ НА КРЕДИТ

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class LoanApplication extends Model
{
    public function user()
    {
        return $this->hasOne('App\User', 'id','user_id');
    }

    public function loanDuration()
    {
        return $this->hasOne('App\LoanDuration', 'id','loan_duration_id');
    }

    public function interest()
    {
        return $this->belongsTo('App\LoanInterest','loan_id', 'id');
    }    

    public function penalty()
    {
        return $this->belongsTo('App\LoanPenalty','loan_id', 'id');
    }    
}

МОДЕЛЬ ИНТЕРЕСА КРЕДИТОВ

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class LoanInterest extends Model
{
    public function loanInterest()
    {
        return $this->belongsTo('App\LoanApplication','loan_id', 'id');
    }    
}

МОДЕЛЬ ШТРАФОВ КРЕДИТОВ

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class LoanPenalty extends Model
{
    public function loanPenalties()
    {
        return $this->belongsTo('App\LoanApplication','loan_id', 'id');
    }    
}

для моего контроллера

public function collectorMembers($id)
{
    $collectormember = CollectorMember::where('collector_id',$id)->get();

    return view('dashboard.collector-members.collector-borrowers-list', compact('collectormember'));
}

Это дает этот результат

enter image description here

CollectorMember получает информацию об этой таблице

enter image description here

Можете ли вы помочь мне, пожалуйста? Большое спасибо заранее!

1 Ответ

2 голосов
/ 02 ноября 2019

Есть способ выполнить то, что вам нужно, но сначала я думаю, что вам нужно пересмотреть свою схему и отношения.

  • Столбцы внешнего ключа должны быть того же типа, что и упомянутый столбец,Например, loan_id в loan_interests должно быть int(11) точно так же, как столбец id в таблице loan_applications
  • Я думаю, вы можете сбивать с толку типы отношений. Например, User hasMany LoanApplication с и LoanApplication belongsTo а User. A LoanApplication hasMany LoanPenalty с и hasMany LoanInterest с. A LoanPenalty и a LoanInterest оба belongsTo a LoanApplication
  • Столбец user_id в таблице loan_penalities является избыточным, поскольку LoanPenalty belongsTo a LoanApplication иLoanApplication belongsTo a User
  • Я бы рекомендовал хранить суммы в валюте в центах и ​​использовать целые числа без знака в качестве типа столбца (например, для interest_amount)

Рассмотримследующая схема (некоторые столбцы не показаны): enter image description here

Затем рассмотрите следующие модели со связями:

class User extends Model {
    public function loanApplications()
    {
        return $this->hasMany(LoanApplication::class);
    }

    public function collectors()
    {
        return $this->belongsToMany(Collector::class);
    }
}

class Collector extends Model {
    public function users()
    {
        return $this->belongsToMany(User::class);
    }
}

class LoanApplication extends Model {
    public function user()
    {
        return $this->belongsTo(User::class);
    }

    public function loanDuration()
    {
        return $this->belongsTo(LoanDuration::class);
    }

    public function loanInterests()
    {
        return $this->hasMany(LoanInterest::class, 'loan_id');
    }

    public function loanPenalties()
    {
        return $this->hasMany(LoanPenalty::class, 'loan_id');
    }
}

class LoanDuration extends Model {
    public function loanApplications()
    {
        return $this->hasMany(LoanApplication::class);
    }
}

class LoanInterest extends Model {
    public function loanApplication() {
        return $this->belongsTo(LoanApplication::class, 'loan_id');
    }
}

class LoanPenalty extends Model {
    public function loanApplication()
    {
        return $this->belongsTo(LoanApplication::class, 'loan_id');
    }
}

Затем перечислите все заявки на кредит вКонтроллер ресурсов:

class LoanApplicationController extends Controller {
    public function index()
    {
        $loan_applications = LoanApplication
                                ::with(['user', 'loanInterests', 'loanPenalties'])
                                ->get();

        $loan_applications = $loan_applications->map(function ($loan_application) {
            $loan_application->loan_penalities_sum = $loan_application->loanPenalties->sum('penalty_amount_cents');
            $loan_application->loan_interests_sum = $loan_application->loanInterests->sum('interest_amount_cents');
            return $loan_application;
        });

        return view('dashboard.loan-applications.index', compact('loan_applications'));
    }
}

И в вашем dashboard.loan-applications.index шаблоне блейда:

<table>
    <tr>
        <th>Username</td>
        <th>Total Interest</td>
        <th>Total Penalty</td>
    </tr>
    @foreach ($loan_applications as $loan_application)
        <tr>
            <td>{{$loan_application->user->username}}</td>
            <td>{{$loan_application->loan_interests_sum}}</td>
            <td>{{$loan_application->loan_penalties_sum}}</td>
        </tr>
    @endforeach
</table>

Обратите внимание, что приведенный выше пример не включает нумерацию страниц;все ресурсы загружаются одновременно.

В приведенном выше примере также предполагается, что должно быть отношение «многие ко многим» между collectors и users, но я бы предположил, что Collector должно бытьотносится к таблице loan_applications, а не к User.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...