Как извлечь данные из одной таблицы на основе расчета двух других таблиц? - PullRequest
1 голос
/ 03 апреля 2019

Предположим, у меня есть три модели, названные Customer ,Invoice и Payment. Модель счета и оплаты выглядит как

id , customer_id, amount

Я хочу получить только тех клиентов, чьи Invoice.sum(amount)>Payment.sum(amount) с разницей в сумме

Я сейчас получаю как

$customers=Customer::get();
foreach($customers as $customer)
{  
  $pay=Payment::where('customer_id',$customer->id)->sum('amount');
  $due=Invoice::where('customer_id',$customer->id)->sum('amount');
  if($due>$pay){
   // showing this customers 
   }
}

Есть ли лучший способ с красноречивым соединением? Как я могу получить In Laravel Eloquent?

Ответы [ 2 ]

2 голосов
/ 03 апреля 2019

Вы установили какие-либо отношения в модели? Лучший красноречивый запрос будет выглядеть следующим образом. Возможно, вам придется настроить немного

Customer::join('payment','customer.id','=','payment.customer_id')
          ->join('invoice','customer.id','=','invoice.customer_id')
          ->select(array('customer.*'),DB::raw("SUM(payment.amount) as payment_sum,SUM(invoice.amount) as invoice_sum"))
          //->where('customer_id',$customer->id)
          ->groupBy('customer.id')  //replace with anything that make sense for you.
          ->havingRaw('invoice_sum > payment_sum')
          ->get();
1 голос
/ 03 апреля 2019

Попробуйте это

Сначала определите отношения в вашей Customer Модели

public function payments()
{
  return $this->hasMany(Payment::class); //based on your logic or structure
}

public function invoices()
{
  return $this->hasMany(Invoice::class); //based on your logic or structure
}
Customer::with(['payments' => function($query) {
               $query->sum('amount');
         }])
        ->get();

или

$customers=Customer::with('payments','invoices')->get();
foreach($customers as $customer)
{  
  $pay = $customer->payments()->sum('amount');
  $due = $customer->invoices()->sum('amount');

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