我正在玩Laravel模型,我需要一个模型来返回一个不在db表中但通过运行模型方法得到的值。此方法运行对分组结果进行分组和计数的查询。
模型方法工作得很好,但我似乎无法在构造函数中用不同于0的东西预先填充$quantity变量。
这是模型的摘录:
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"来自与我粘贴的模型摘录相关的用户模型。
我还注意到,quantity()方法被调用,它一直返回0,就好像$this->cart_id是空的一样,并且用实际值更改$this-cart_id,查询本身甚至不会执行。
非常感谢你们提出的任何建议。
您是否尝试过使用$this->属性访问属性?
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;
}
}