我有一个带有自定义访问器的模型,所以我得到了自定义属性
class Order extends GSModel{
$appends = ['orderContents'];
public function getOrderContentsAttribute()
{
return $this->contents()->get();
}
}
但现在,在一个案例中,我只需要获得一些字段,而不需要OrderContents
个字段。
$openOrders = Order::open()->has('contents')->get(['id','date','tableName']);
但是这样做,它还会返回OrderContents
。
有没有办法不去那个领域?
谢谢!
答案 0 :(得分:28)
令人失望的是,这里的人给了你错误的信息。实际上有一种实现此目的的内置方法,直接写入requests
类,称为Illuminate\Database\Eloquent\Model
。
要检索Model::getOriginal
属性,忽略foo
中定义的访问者,只需拨打Model::getFooAttribute
即可。此方法在$myModel->getOriginal('foo');
的行3087上定义。
请注意,此方法会获取模型上的原始值。这意味着如果您对该模型实例上的属性进行任何修改,则上述解决方案将不会反映这些修改。只要您只是检索该值,就应该没有问题。
答案 1 :(得分:13)
没有办法一次性完成,所以这就是你需要的:
$openOrders = Order::open()->has('contents')->get(['id','date','tableName']);
$openOrders->each(function ($order) {
$order->setAppends([]);
});
或者,您可以在最后一步使用Laravel的Higher Order Messaging:
$openOrders->each->setAppends([]);
答案 2 :(得分:6)
好吧,我不是说这是一个很好的解决方案,但是它有效,你可以使用循环...
将此添加到您的模型中:
public static $withoutAppends = false;
protected function getArrayableAppends()
{
if(self::$withoutAppends){
return [];
}
return parent::getArrayableAppends();
}
然后,当您要禁用$appends
属性时:
Order::$withoutAppends = true;
$openOrders = Order::open()->has('contents')->get(['id','date','tableName']);
答案 3 :(得分:2)
从模型类中获取未突变值的更一致和可靠的方法是从属性属性中检索它,如下所示:
$this->attributes['name']
但请注意,属性是受保护的属性,因此您不能从模型类外部执行此操作。在这种情况下,您可以使用
$model->getAttributes()['name']
在 Laravel 8 中为我工作
答案 4 :(得分:1)