Laravel,如何忽略访问器

2022-08-30 16:15:12

我有一个带有自定义访问器的模型,所以我得到了那个自定义属性,

    class Order extends GSModel{

        $appends = ['orderContents'];

        public function getOrderContentsAttribute()
        {
            return $this->contents()->get();
        } 
 }

但是现在,在一种情况下,我只需要获取一些字段,而没有这个字段。OrderContents

$openOrders         = Order::open()->has('contents')->get(['id','date','tableName']);

但是这样做,它也回报了我。有没有办法不获取该字段?OrderContents

谢谢!


答案 1

令人失望的是,这里的人给了你虚假的信息。实际上,有一种内置的方法可以实现这一点,直接写入类中,称为.Illuminate\Database\Eloquent\ModelModel::getOriginal

要检索该属性,忽略其在 中定义的访问器,只需调用 。此方法在 的第 3087 行定义。fooModel::getFooAttribute$myModel->getOriginal('foo');Illuminate\Database\Eloquent\Model

请记住,此方法获取模型上的原始值。这意味着,如果对该模型实例上的属性进行任何修改,上述解决方案将不会反映这些修改。只要您只是检索值,就应该没有问题。


答案 2

没有办法一次性完成,所以这是你需要的:

$openOrders = Order::open()->has('contents')->get(['id','date','tableName']);

$openOrders->each(function ($order) {
  $order->setAppends([]);
});

或者,您可以在最后一步使用Laravel的高阶消息传递

$openOrders->each->setAppends([]);

推荐