2017-02-21 5 views
0

Я использую плагин jQuery datatables и добавляю столбец valores_receber (values_to_receive) с использованием цикла foreach, который выполняет сумму, но отдельным способом, как вы можете видеть в следующем коде.Как суммировать значение двух столбцов из двух разных таблиц с использованием Laravel's Eloquent

public function anyDataReceber() { 

$clientes = Partner::whereHas('faturamentos', function($q){ 
     $q->where('status', '<>', 'CANCELADO'); 
    }) 
    ->orWhereHas('faturamentosLivres', function ($q) { 
     $q->where('status','<>','CANCELADO'); 
    }) 
    ->with('faturamentos') 
    ->with('faturamentosLivres'); 

return Datatables::of($clientes) 
    ->addColumn('valores_receber', function ($clientes) { 
     $total = 0; 
     foreach($clientes->faturamentos as $fatura1) { 
      if ($fatura1->status != 'CANCELADO') $total += $fatura1->total_usd - $fatura1->valor_pago; 
     } 
     foreach($clientes->faturamentosLivres as $fatura2) { 
      if ($fatura2->status != 'CANCELADO') $total += $fatura2->total_usd - $fatura2->valor_pago; 
     } 
     return number_format($total,2,',','.'); 
    }) 
    ->addColumn('action', function ($clientes) { 
     $actions = ''; 
     $actions = '<a href="/admin/financeiro-matriz/contas-receber/'.$clientes->id.'" class="btn btn-xs btn-primary"><i class="fa fa-eye"></i> Visualizar</a>'; 
     return $actions; 
    }) 
    ->make(true); 

}

Проблема здесь состоит в том, что DataTable не может приказать столбец valores_receber, потому что это очень столбец не существует в результате запроса из красноречивых.

Я исследовал функцию SUM() из mySQL, но я не могу сделать решение, используя отношения Eloquent и таблицы.

Я проверил следующие ответы, которые должны быть на правильном пути, но вместо этого используется обычный SQL, и из того, что я исследовал, ему нужны какие-то команды объединения или объединения, но как выполнить это в Eloquent?

Так что для DataTable, чтобы иметь возможность заказать колонки valores_receber, мне нужно этот столбец, чтобы показать в результатах своего рода заявление красноречив.

То, что я пытаюсь достичь:

  • сделать запрос с помощью красноречивых, который суммирует значения столбцов total_usd, который присутствует в обеих таблицах faturamentos и faturamentos_livres (счета-фактуры и free_invoices)
  • эти таблицы должен быть ограничен столбцом состояния, который должен быть любым значением, но CANCELADO (отменено). Этот столбец статус типа ENUM

EDIT: Я использую DB: сырье() как это было предложено @ d1c1pl3, но я все еще хочу знать, элегантное решение с помощью красноречивых. Ниже моя уродливая попытка, которая работает, используя исходные запросы и на основе этого ответа: https://stackoverflow.com/a/7432219/2465086

public function anyDataReceber() { 

// 1 - getting all IDs of clients that have faturamentos or faturamentosLivres 

    $clientes = Partner::whereHas('faturamentos', function($q){ 
      $q->where('status', '<>', 'CANCELADO'); 
     }) 
     ->orWhereHas('faturamentosLivres', function ($q) { 
      $q->where('status','<>','CANCELADO'); 
     }) 
     ->with('faturamentos') 
     ->with('faturamentosLivres') 
     ->pluck('id') 
     ->toArray(); 

// 2 - Converting to string for use in the query 

    $ids = implode(',',$clientes); 

// 3 - the ugly query that I want to do using Eloquent. It filters by the status and filters by clients´ ids returned before. It is not appealing either because it uses subselects and a join 

    $result = DB::select(DB::raw(
       'SELECT partners.client, cliente_id, (SUM(t.total_usd) - SUM(t.valor_pago)) AS valores_receber 
FROM (SELECT cliente_id, total_usd, valor_pago FROM faturamentos WHERE status <> "CANCELADO" AND cliente_id IN ('.$ids.') 
     UNION ALL 
     SELECT cliente_id, total_usd, valor_pago FROM faturamentos_livres WHERE status <> "CANCELADO" AND cliente_id IN ('.$ids.')) t 
JOIN partners ON partners.id= cliente_id 
GROUP BY cliente_id' 
       )); 

// 4 - converting to Collection because the Datatables class expects it 

    $result = collect($result); 

// 5 - The return is the only part that is easy to read and feels like it is in the right track 

    return Datatables::of($result) 
     ->editColumn('valores_receber', function ($result) { 
      return number_format($result->valores_receber,2,',','.'); 
     }) 
     ->addColumn('action', function ($result) { 
      $actions = ''; 
      $actions = '<a href="/admin/financeiro-matriz/contas-receber/'.$result->cliente_id.'" class="btn btn-xs btn-primary"><i class="fa fa-eye"></i> Visualizar</a>'; 
      return $actions; 
     }) 
     ->make(true); 
} 

ответ

0

Если вы знаете, как сделать это с MySQL я хотел бы использовать исходные выражения

https://laravel.com/docs/5.4/queries#raw-expressions

+0

кажется, что нет никакого способа сделать это с Красноречивым. Я попытаюсь использовать сырое выражение и поделиться результатами – WeidMaster

Смежные вопросы