2016-05-24 5 views
0

Извините за мой английский.Получите сумму счета в методе класса

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

Я создал модель «Продажа», который содержит метод AmountOrder

public function AmountOrder() 
    { 

     $AmountOrder = DB::table('goods') 
      ->join('sale_lines', 'sale_lines.good_id', '=', 'goods.id') 
      ->where('sale_id', $this->id) 
      ->select(DB::raw('SUM(price*quantity) as total_sales')) 
      ->value('total_sales'); 

     return $AmountOrder; 

    } 

и выводить код, как этот

@foreach ($sales as $sale) 
    <tr> 
     <td class="table-text"><div>{{ $sale->id }}</div></td> 

     <td> 
      {{ $sale->client->name }} 
     </td> 
     <td> 
      {{$sale->date}} 
     </td> 
     <td> 
      {{$sale->AmountOrder($sale)}} 
     </td> 
     <td> 
      {{$sale->debt($sale)}} 
     </td> 
     <td> 
      {{$sale->date_of_issue}} 
     </td> 
    </tr> 
@endforeach 

Но проблема заключается в том, что запрос выполняется на каждой строке , Я новичок в Laravel, но подумал, что вы можете решить эту проблему как-нибудь красивее?

спасибо, что заблаговременно!

+0

Ваш метод не имеет параметр так '$ продажи-> AmountOrder ($ продажа)' должен быть '$ продажи-> AmountOrder()' – RiggsFolly

+0

Вы дали правильная связь между вашими продажами и хорошим? –

+0

Вы говорите, что я прописал миграционную руду в своей модели? – Grozwalker

ответ

0

Возможно, вы говорите об Eager Loading.

Из документов:

При доступе Eloquent отношения как свойства, данные отношения «ленивым загружен». Это означает, что данные отношения фактически не загружаются до тех пор, пока вы не сначала получите доступ к свойству. Тем не менее, Eloquent может поддерживать отношения «с нетерпением» во время запроса родительской модели. Нежелательная загрузка устраняет проблему с запросом N + 1.

Однако вы не сможете использовать Eager Loading now, используя этот код в методе AmountOrder.

Простой поиск по Google также привел меня к this example of Eager Loading с совокупными функциями/отношениями.

Возможно, это будет хорошее начало, чтобы подумать и реализовать свое решение.

+0

Спасибо за ответ! Я еще не получил, но теперь я знаю, куда идти – Grozwalker

+0

Рад, что я помог @Grozwalker –

0

у вас есть неправильно в ваше отборного:

$AmountOrder = DB::table('goods') 
     ->join('sale_lines', 'sale_lines.good_id', '=', 'goods.id') 
     ->where('sale_id', $this->id) 
     ->select(DB::raw('SUM(sale_lines.price*sale_lines.quantity) as total_sales')) 
     ->value('total_sales'); 
+0

Возможно, моя версия запроса не совсем правильная, но она также работала. Но спасибо за вашу заметку, я переписываю запрос – Grozwalker

0

Мои отношения

class Sale extends Model 
{ 
    //Получаем товар в этой продаже 
    public function good() 
    { 
     return $this->belongsTo('App\Good'); 
    } 
} 


class Good extends Model 
{ 
    //В каких закупках был этот товар 
    public function purchases() 
    { 
     return $this->hasMany('App\Purchase'); 
    } 

    //Продажи с этим товаром 
    public function sales() 
    { 
     return $this->hasMany('App\Sale'); 
    } 
} 

Является ли это правильно?

0

В моей модели я метод создания

public function AmountOrderRelation() 
{ 

    return $this->belongsTo('App\Good') 
     ->selectRaw('sum(price) as aggregate, id') 
     ->groupBy('id'); 
} 

В контроллере

$new_sales = Sale::with('AmountOrderRelation')->get(); 


@foreach ($new_sales as $sale) 
       <tr> 
        <td class="table-text"><div>{{ $sale->id }}</div></td> 

        <td> 
         {{ $sale->AmountOrderRelation }} 
        </td> 

       </tr> 
      @endforeach 

Но мои отношения равно нулю. Какая у меня ошибка?

0

Я сделал это!

public function AmountOrder() 
{ 

    return $this->HasOne('App\SaleLines') 
     ->join('goods', 'sale_lines.good_id', '=', 'goods.id') 
     ->selectRaw(DB::raw('SUM(price*quantity) as aggregate, sale_id')) 
     ->groupBy('sale_id'); 
} 

public function getAmountOrderAttribute() 
{ 
    // if relation is not loaded already, let's do it first 
    if (! array_key_exists('AmountOrder', $this->relations)) 
     $this->load('AmountOrder'); 

    $related = $this->getRelation('AmountOrder'); 

    // then return the count directly 
    return ($related) ? (int) $related->aggregate : 0; 
} 

И контроллер

$sales = Sale::with('AmountOrder')->get(); 
Смежные вопросы