2017-01-17 7 views
0

У меня есть модель, в которой я получаю всего того, как это:Как связать метод с текущим состоянием модели?

public function total() 
{ 
    $total = $this->subtotal(); 
    foreach ($this->lineItems as $l) { 
     $total += $l->amount; 
    } 
    return $total; 
} 

Я хочу, чтобы добавить метод formated() который будет форматировать subtotal и total метод возвращает с функцией number_format($numberHere, 2).

Я хочу, чтобы он был динамичным не как: totalFormated или subtotalFormated. Я хочу вывести сформированное значение следующим образом: $order->total()->formated();.

Есть ли какой-нибудь шанс, я могу получить это, чтобы работать?

+0

Невозможно, но я бы порекомендовал его. Вам понадобится раздуть вашу модель с большим количеством дополнительной логики для этих методов, которые не имеют ничего общего с базой данных. Возможно, посмотрите [accessors] (https://laravel.com/docs/5.3/eloquent-mutators # define-a-accessor) для этих типов «вычисленных атрибутов». Однако, если вы действительно хотите сделать это цепочкой [здесь хороший старт] (http://stackoverflow.com/questions/3724112/php-method-chaining) – devk

+0

Я не хочу добавлять 'number_format ($ numberHere, 2) 'Каждая строка, которую я хочу вывести, итоговая сумма или промежуточный итог или суммы скидки или налога. Вот почему я хочу реализовать это здесь. Или если вы предложите другое (лучшее) решение? – Buglinjo

ответ

2

Создание общей как дисперсии экземпляра

protected $total; 

затем изменить функцию этой

public function total() 
{ 
    $this->total = $this->subtotal(); 
    foreach ($this->lineItems as $l) { 
     $this->total += $l->amount; 
    } 

    return $this; 
} 

затем создать отформатированный функцию

public function formated() 
{ 
    return number_format($this->total, 2) 
} 

теперь вы можете цепи функция как

$order->total()->formated() 

** Обновлено **

вы можете вернуть как общее и промежуточные итоги в отформатированный функции

public function formated() 
{ 
    return [ 
     "total" => number_format($this->total, 2), 
     "subtotal" => number_format($this->subtotal, 2) 
    ]; 
} 

** или **

вы можете использовать одну переменную экземпляра как для общего, так и для промежуточного уровня. пусть имя этого varibles myTotals

protected $myTotals; 

public function total() 
{ 
    $this->myTotals = $this->subtotal(); 
    foreach ($this->lineItems as $l) { 
     $this->myTotals += $l->amount; 
    } 

    return $this; 
} 


public function subTotal() 
{ 
    $this->myTotals = $this->subtotal(); 
    foreach ($this->lineItems as $l) { 
     $this->myTotals += $l->amount; 
    } 

    return $this; 
} 

public function formated() 
{ 
    return number_format($this->myTotals, 2) 
} 

так что в этом случае вы можете позвонить

$order->total()->formated() // and this will return the total 
$order->subTotal()->formated() // and this will return the subtotal 
+0

Он будет работать только с итогом. Я хочу, чтобы он тоже работал с промежуточным итогом. Спасибо. – Buglinjo

+0

@Buglinjo вы пробовали применить этот же принцип, но внутри 'subtotal' метод? – Mihailo

+0

i dnt действительно понимаю, как вы хотите работать с промежуточным итогом. Но обновит мой ответ на возможные решения. – oseintow

0

Вам просто нужно сохранить $total как свойство ($this->total += $l->amount) и в конце вашего метода total() возврата тока экземпляра класса = $ это, в основном:

public function total() 
{ 
    $this->total = $this->subtotal(); 
    foreach ($this->lineItems as $l) { 
     $this->total += $l->amount; 
    } 

    return $this; 
} 

Теперь ваш метод г eturns экземпляра класса самих, так что вы можете вызвать другой метод (или что-нибудь еще в пределах этого класса):

public function format() 
{ 
    return number_format($this->total, 2); 
} 

И с этим вы должны быть в состоянии «цепь» ваши методы. Ключ должен вернуть экземпляр .

$order->total()->formated()