Laravel,如何忽略访问者

时间:2015-01-18 21:31:12

标签: php laravel laravel-4 eloquent

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

    class Order extends GSModel{

        $appends = ['orderContents'];

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

但现在,在一个案例中,我只需要获得一些字段,而不需要OrderContents个字段。

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

但是这样做,它还会返回OrderContents。 有没有办法不去那个领域?

谢谢!

5 个答案:

答案 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)

对于 Laravel <= 6.x,

有一个内置的 getOriginal 方法可以在没有访问器的情况下从模型中获取原始值。见:6.x

$myModel->getOriginal('foo');

对于 Laravel 7.x 和 8.x,

您应该使用 getRawOriginal 内置方法从模型中检索原始值。见:8.x

$myModel->getRawOriginal('foo');

7.x 和 8.x 中的 getOriginal 方法将通过访问器返回属性值。