2013-12-17 2 views
2

Я играю с моделями Laravel, и мне нужно вернуть значение, которое не находится в таблице db, но оно выполняется путем запуска метода модели. Этот метод выполняет запрос, который группирует и подсчитывает сгруппированные результаты.Невозможно присвоить значение переменной в конструкторе модели

Метод модель прекрасно работает, но я, кажется, не быть в состоянии предварительно заполнить переменную $ количество в конструкторе с чем-то другом, чем 0.

Так что это отрывок из модели:

public $quantity; 

function __construct($attributes = array(), $exists = false) { 
    parent::__construct($attributes, $exists); 
    $this->quantity = $this->quantity(); 
} 

public function quantity() 
{ 
    $query = DB::table('carts_shopping') 
      ->select('cart_id', DB::raw('COUNT(*) AS quantity')) 
      ->where('cart_id',$this->cart_id) 
      ->groupBy('cart_id') 
      ->first(); 
    return ($query) ? $query->quantity : 0; 
} 

Хотя это, как я пытаюсь получить результаты от контроллера:

$cartitems = Auth::user()->cartshopping; 

foreach ($cartitems as $cartitem) 
{ 
    echo $cartitem->name; 
    echo $cartitem->quantity; 
} 

как вы можете догадаться «cartshopping» происходит от модели пользовательского существа относятся d с выдержкой модели, которую я вставил.

Я также заметил, что метод amount() вызывается и он возвращает 0 все время, как будто $ this-> cart_id пуст и, изменяя $ this-cart_id с реальным значением, сам запрос даже не выполняется ,

Большое спасибо за любое предложение, которое вы, ребята, можете разделить.

+0

Вы пробовали var_dump ($ query); как раз перед возвращением? Он может не содержать того, что, по вашему мнению, он делает, или может быть на самом деле равен 0. – vascowhite

+0

Только что попробовал: к сожалению, dd ($ query); возвращает NULL. Та же настройка результатов -> где ('cart_id', 23) с '23' - известное значение. –

+0

Тогда ваш запрос не возвращает никаких результатов. – vascowhite

ответ

1

Вы пытались получить доступ к свойствам с помощью $ this-> attributes?

public $quantity; 

function __construct($attributes = array(), $exists = false) { 
    parent::__construct($attributes, $exists); 
    $this->quantity = $this->quantity(); 
} 

public function quantity() { 
    $query = DB::table('carts_shopping') 
      ->select('cart_id', DB::raw('COUNT(*) AS quantity')) 
      ->where('cart_id', $this->attributes['cart_id']) 
      ->groupBy('cart_id') 
      ->first(); 
    return ($query) ? $query->quantity : 0; 
} 

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

class YourModel { 

    // Normal model data here 

    public function getQuantityAttribute() { 
     $query = DB::table('carts_shopping') 
      ->select('cart_id', DB::raw('COUNT(*) AS quantity')) 
      ->where('cart_id', $this->attributes['cart_id']) 
      ->groupBy('cart_id') 
      ->first(); 
     return ($query) ? $query->quantity : 0; 
    } 

} 
+0

Спасибо за ваши усилия Ollieread, просто попробовал, и это приводит к повышению исключения: Неопределенный индекс: cart_id. Мне интересно, если проблема находится где-то в другом месте, так как Laravel создает модель и вызывает вызов конструктора. Что касается «ядовитых аксессуаров», это была моя первая мысль, но я только что понял из документов Laravel, что они используются для «преобразования ваших атрибутов модели при получении или настройке». в то время как мой атрибут $ amount не существует в самой модели ... Я просто вычисляю его сам, следовательно, метод. Я неправильно понял главу о доступе? –

+1

Аксессуры могут использоваться таким образом, но их также можно использовать для добавления атрибутов, которые не существуют. Вышеприведенный код, который я дал, можно обернуть, чтобы убедиться, что существует $ this-> attributes ['cart_id'], но он должен работать. Чтобы дать вам пример, у меня есть 'active' int (1) в моих таблицах, но у меня есть getIsActiveAttribute() accessors, которые возвратят логические значения для $ model-> is_active. Попробуйте удалить свой пользовательский конструктор и убедиться, что объект существует перед началом работы. – ollieread

+0

Хорошо ... переключение на методы «аксессоров» работало как шарм. Теперь у меня есть мое -> количество, возвращающее правильные результаты, но я не использовал трюк $ this-> attributes ['cart_id'], $ this-> cart_id работал отлично. –

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